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

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

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

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

#3如果同时发送“类型”和“标签”-显示所有带有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更容易?

最佳答案

您绝对应该在表格设计上进行工作。动态表名是一个很大的问题,因为您将永远无法进行任何有用的联接。只需创建一个大标签表并像在表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);

09-25 20:53