简体   繁体   中英

Pagination. Select from x number of tables

i'm trying to make my second website using php and i'm stuck at some typical problem (i believe), but very hard for me.

I'm making a page that show list of items depends on GET.

#1 if only "type" sended - show all items with x type.

#2 if only "tag" sended - show all items with x tag.

#3 if "type" and "tag" sended at the same time - show all items with x type and x tag.

problem #1 i solved this way

// 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';}

}

pagination

// 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>";
            }
        }
    }
}

I'm stuck at problem #2.

I got tag ID. Need to show all items with that tag. I don't understand how to make a SELECT from x-number of tables with a working paginatin.

database structure - 在此输入图像描述

Any help is welcome!

PS Maybe i need to change db structure to make SELECT easier?

You should definitely work on your table design. Having dynamic table names is a big NO-NO as you won't ever be able to do any useful joins. Just create one big tag-table and add a column type like you did in your table item_types .

To solve problems #1-#3 just build the WHERE -part of your query dynamically:

// 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);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM