【问题标题】:PHP pagination with multiple GET variables具有多个 GET 变量的 PHP 分页
【发布时间】:2016-08-14 17:43:25
【问题描述】:

我正在为 2 个获取变量的分页而苦苦挣扎 - 其中 1 个是页码。

我的第二个$_GET 变量是$_GET['cat'],它正在获取我想要过滤的产品类别。

一切都适用于分页显示,页数等,但是,如果我在特定类别上被过滤,结果的第一页显示正常,但是当我尝试进入下一页或任何页码时,没有任何产品显示。

任何帮助将不胜感激,请参阅下面的代码。

<?php include("header.php");
echo '<div id="content_header"><center><h1> • Products • </h1></center></div>';
echo '<div id="products_left">
                Show:<br />
                <ul style="list-style-type:none; margin:0; padding:0;">
                    <li><a href="?cat=wedding">Wedding Stationery</a></li>
                    <li><a href="?cat=frame">Frames</a></li>
                    <li><a href="?cat=nappy">Nappy Cakes</a></li>
                    <li><a href="?cat=misc">Miscellaneous</a></li>
                    <li><a href="/michelle/products.php">All</a></li>
                </ul>
            </div>';
echo '<div id="clear"></div>';
echo '<div style="padding-left:150px; margin-top:-70px">';
$connect = mysqli_connect("localhost","root","") or die("Failed to connect to database");
mysqli_select_db($connect,"magical_moments") or die("Unable to find database");

if(empty($_GET['cat'])){
    $query = mysqli_query($connect,"SELECT * FROM products");
} else {
    $cat = $_GET['cat'];
    $query = mysqli_query($connect,"SELECT * FROM products WHERE type='$cat'");

};

$products = mysqli_fetch_array($query);

$start = 0;
$limit = 9;

if(isset($_GET['page']))
{
    $pid=$_GET['page'];
    $start=($pid-1)*$limit;
}
else{
    $pid=1;
}
//Fetch from database first 10 items which is its limit. For that when page open you can see first 10 items.
if(empty($_GET['cat'])){
    $query = mysqli_query($connect,"SELECT * FROM products LIMIT $start, $limit");
} else {
    $cat = $_GET['cat'];
    $query = mysqli_query($connect,"SELECT * FROM products WHERE type='$cat' LIMIT $start, $limit");

};

?>
<ul>
<?php
//print 10 items
while($result=mysqli_fetch_array($query))
{
        echo '<div id="display_product">
                        <table>
                        <tr>
                            <td><div id="product_image_holder" style="background-image:url('.$result[5].')"></div></td>
                        </tr>
                            <tr>
                                <td>'.$result[1].'</td>
                            </tr>
                            <tr>
                                <td>'.$result[3].'</td>
                            </tr>
                            <tr>
                                <td>£ '.$result[4].'</td>
                            </tr>
                        </table>
                    </div>';
}
echo '<div id="clear"></div>';
?>
</ul>
<?php
//fetch all the data from database.


echo '<div id="pagination_div">';

if(empty($_GET['cat'])) {

    $rows=mysqli_num_rows(mysqli_query($connect,"SELECT * FROM products"));
    //calculate total page number for the given table in the database
    $total=ceil($rows/$limit);

if($pid>1)
{
    //Go to previous page to show previous 10 items. If its in page 1 then it is inactive
    echo "<a href='?page=".($pid-1)."' class='previous_button'>PREVIOUS</a>";
}
if($pid!=$total)
{
    ////Go to previous page to show next 10 items.
    echo "<a href='?page=".($pid+1)."' class='next_button'>NEXT</a>";
}

//show all the page link with page number. When click on these numbers go to particular page.
        for($i=1;$i<=$total;$i++)
        {
            if($i==$pid) { echo "<li class='current'>".$i."</li>"; }

            else { echo "<li class='pagination'><a href='?page=".$i."'>".$i."</a></li>"; }
        }
        echo '</div>';

} else {

    $rows=mysqli_num_rows(mysqli_query($connect,"SELECT * FROM products WHERE type='$cat'"));
    //calculate total page number for the given table in the database
    $total=ceil($rows/$limit);

     // cat is set - pagination for cat + page

     if($pid>1)
     {
        //Go to previous page to show previous 10 items. If its in page 1 then it is inactive
        echo "<a href=".$_SERVER['REQUEST_URI']."?page=".($pid-1)." class='previous_button'>PREVIOUS</a>";
     }
     if($pid!=$total)
     {
        ////Go to previous page to show next 10 items.
        echo "<a href=".$_SERVER['REQUEST_URI']."?page=".($pid+1)." class='next_button'>NEXT</a>";
     }

     //show all the page link with page number. When click on these numbers go to particular page.
            for($i=1;$i<=$total;$i++)
            {
                if($i==$pid) { echo "<li class='current'>".$i."</li>"; }

                else { echo "<li class='pagination'><a href=".$_SERVER['REQUEST_URI']."?page=".$i.">".$i."</a></li>"; }
            }
            echo '</div>';

        };

?>
</ul>
</div>
<?php include("footer.php"); ?>

【问题讨论】:

  • 您的代码容易受到SQL-Injections 的攻击。请开始使用准备好的参数化查询。
  • 它不会被托管,所以我在保护变量方面并不小心。目前我只是尝试使用 localhost 进行一些练习。
  • 为什么要查询数据库两次?删除一个。
  • 然后正确地练习,如果你认为在重要的时候你会做对,那你就错了。
  • 非常正确。我试图先掌握基础知识,但这是一个很好的观点。

标签: php variables pagination get


【解决方案1】:

好吧,你定义了页面参数。但是一旦单击链接,类别参数就会丢失,因为它根本不存在。

你有这个:

echo "<li class='pagination'><a href=".$_SERVER['REQUEST_URI']."?page=".$i.">".$i."</a></li>";

您缺少参数 cat。这是一个例子:

echo '<li class="pagination"><a href="'.$_SERVER['REQUEST_URI'].'?page='.$i.'&cat='.$_GET['cat'].'">'.$i.'</a></li>';

【讨论】:

  • 不幸的是,这并没有解决问题。即使设置了正确的参数,第 1 页也不会显示任何内容。它只是一个带有下一步按钮的空白页面...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-15
相关资源
最近更新 更多