分页。从x个表中选择

时间:2012-04-01 10:00:57

标签: php mysql pagination

我正在尝试使用php创建我的第二个网站,而且我遇到了一些典型的问题(我相信), 但对我来说很难。

我正在创建一个显示项目列表的页面取决于GET。

#1,如果只有“类型”发送 - 显示所有x类型的项目。

#2如果仅发送“tag” - 显示带有x标签的所有项目。

#3如果同时发出“type”和“tag” - 显示所有带x类型和x标签的项目。

问题#1我这样解决了

// items per page
$per_page = 5;

// 1) if isset type
if ( (isset($_GET['type'])) && (!isset($_GET['tag'])) ){
    $type_id = get_safe_var($_GET['type']);

    $con = mysql_connect(DB_HOST,DB_LOGIN,DB_PASSWORD) or die(mysql_error());
    if ($con) {
        mysql_select_db(DB_NAME) or die(mysql_error());

        $sql = mysql_query("SELECT `item_type`, `item_type_name` FROM `item_types` WHERE `type_id` = '$type_id'");

        $row = mysql_fetch_assoc($sql);
        $type = $row['item_type'];
        $type_name = $row['item_type_name'];

        if ($type != ''){
            $pages_query = mysql_query("SELECT COUNT(`id`) FROM `".$type."` WHERE `insearch` = '1'");

            $number_of_pages = ceil( mysql_result($pages_query, 0) / $per_page );

            $current_page = ( (isset($_GET['page'])) && ((int)$_GET['page'] > 0) ) ? (int)$_GET['page'] : 1;
            $start = ($current_page - 1) * $per_page;

            echo "<h1>$type_name</h1>";
            $sql = mysql_query("SELECT `id`, `name`, `img` FROM `".$type."` WHERE `insearch` = '1' ORDER BY `id` DESC LIMIT $start, $per_page");
            // echo items
            while ($row = mysql_fetch_assoc($sql)){
                $id = $row['id'];
                $name = $row['name'];
                $img = $row['img'];

                echo "
                    <div id='items_cell'>
                        <img alt='$name' src='$img' width='145' height='200' /><br />
                        <a href='open_item.php?type=$type_id&id=$id'>$name</a><br />
                        <em>$type_name</em>
                    </div>";
            }
        }           
        mysql_close($con);
    } else {echo 'sql connection error';}

}

分页

// echo pagination

// 1) if isset type
if ( (isset($_GET['type'])) && (!isset($_GET['tag'])) ){
    if ( (isset($number_of_pages)) && ($number_of_pages >= 1) && ($current_page <= $number_of_pages) ){    
        for ($i = 1; $i <= $number_of_pages; $i++){
            if ($i == $current_page){
                echo "<li><a href='?type=$type_id&page=$i' class='sel'>$i</a></li>";
            } else {
                echo "<li><a href='?type=$type_id&page=$i'>$i</a></li>";
            }
        }
    }
}

我遇到问题#2。

我有标签ID。需要显示带有该标记的所有项目。 我不明白如何使用工作的paginatin从x个表中进行SELECT。

数据库结构 - enter image description here

欢迎任何帮助!

P.S。也许我需要更改db结构以使SELECT更容易?

1 个答案:

答案 0 :(得分:2)

你绝对应该在你的桌面设计上工作。拥有动态表名是一个很大的NO-NO,因为你永远无法做任何有用的连接。只需创建一个大型标记表,然后像在表type中一样添加一列item_types

解决问题#1-#3只需动态构建WHERE - 部分查询:

// empty selection
$where = array();

if (!empty($_GET["type"])
    $where[] = "`item_type` = '".mysql_real_escape_string($_GET["type"])."'";

if (!empty($_GET["tag"])
    $where[] = "`tag` = '".mysql_real_escape_string($_GET["tag"])."'";

$query = "SELECT ... FROM `item`" 
    // Join type-table
    . " JOIN `item_types` ON `item`.`id` = `item_types`.`item_id`"

    // Join all of this item's tags
    . " JOIN `item_tags` ON `item`.`id` = `item_tags`.`item_id`"

        // Filter tags by item_type
        . " AND `item_types`.`item_type` = `item_tags`.`item_type`"
;

if (count($where) > 0)
    $query .= "WHERE ".implode(" AND ", $where);