【问题标题】:Pagination after search in php在php中搜索后的分页
【发布时间】:2019-05-25 13:07:56
【问题描述】:

我有一个搜索按钮,用于在类别和产品表中进行搜索。 因此,当页面在第一个下拉列表中加载显示类别时,我使用 2 个下拉列表,当用户在第二个下拉列表中选择类别时,它显示该类别中的产品。此外,当页面加载时,默认查询会运行,它会显示所有产品。所以搜索功能运行良好。

问题是我也在使用分页。在搜索之前,分页工作正常(每页 15 条记录),但在搜索后,如果我选择一个类别并搜索,它会显示该类别的所有记录,当我转到下一页时,它会运行默认查询并显示默认结果。我希望它显示我搜索的结果。

<?php 
            $listperpage = 15;
            $c = $_POST['category'];
            $n = $_POST['product'];
            if(!empty($c)){
                $query = "SELECT * FROM tbl_category INNER JOIN tbl_product ON tbl_category.id = tbl_product.fk_id_category WHERE fk_id_category = '$c'";
                $result = mysql_query($query) or die (mysql_query());
            }
            else if(!empty($c) && !empty($n)){
                $query = "SELECT * FROM tbl_category INNER JOIN tbl_product ON tbl_category.id = tbl_product.fk_id_category WHERE fk_id_category = '$c' AND rank_name = '$n'";
                $result = mysql_query($query) or die (mysql_query());
            }else{
                $query = "SELECT * FROM tbl_category INNER JOIN tbl_product ON tbl_category.id = tbl_product.fk_id_category";
                $result = mysql_query($query) or die (mysql_query());
                echo "else one";
            }

            $result_num = mysql_num_rows($result);
            //total pages
            $pages = ceil($result_num/$listperpage);
            //which number the user is crrrently on 
            if (!isset($_GET['page'])) {
                $page = 1;
            } else{
                $page = $_GET['page'];
            }
            //sql limit starting number of results on th page
            $strt_limit_no = ($page - 1)*$listperpage;

            if(isset($_POST["search"])){
                $c = $_POST['category'];
                $n = $_POST['product'];

                if(empty($c)){
                    echo "<span class='form-error'>Select Category first!</span>";
                }
                else if(!empty($c) && !empty($n)){
                    $queryn = "SELECT * FROM tbl_category INNER JOIN tbl_product ON tbl_category.id = tbl_product.fk_id_category WHERE fk_id_category = '$c' AND rank_name = '$n' LIMIT ". $strt_limit_no .','. $listperpage;
                    $results =  mysql_query($queryn) or die (mysql_query());
                }
                else{
                    $queryn = "SELECT * FROM tbl_category INNER JOIN tbl_product ON tbl_category.id = tbl_product.fk_id_category WHERE fk_id_category = '$c' LIMIT ". $strt_limit_no .','. $listperpage;
                    $results =  mysql_query($queryn) or die (mysql_query());
                }
            }
            else{
                $queryn = "SELECT * FROM tbl_category INNER JOIN tbl_product ON tbl_category.id = tbl_product.fk_id_category LIMIT ". $strt_limit_no .','. $listperpage;
                $results = mysql_query($queryn) or die (mysql_query());
                echo "else end";
            }
        ?>
<script type="text/javascript">
    $(document).ready(function() {
        $("#category").on('click',function(){
            var category = $(this).val();
            if(category){
                //alert('3213');
                $.ajax({
                    type:'POST',
                    url:'process.php',
                    data:'category=' + category,
                    success:function(html){
                        $("#product").html(html);
                    }
                });
            }
        });
    });
</script>
<div align="center" class='maintabledivdaily' style='width:100%; padding: 20px 0 15px 0;' >
        <table border="1" cellpadding="5" cellspacing="2" width="80%" >
            <thead>
                <tr>
                    <th colspan="9" bgcolor="#CCCCCC">List of all Ranks</th>
                </tr>
                <tr>
                    <th>ID</th>
                    <th>Category</th>
                    <th>Product Name</th>
                </tr>
            </thead>
            <tbody>
                <?php while ($row = mysql_fetch_array($results)): ?>
                <tr></tr>
                <tr align="center" dir="rtl" style="font-style:">
                    <td><?php echo $row['id']; ?></td>
                    <td><?php echo $row['category']; ?></td>
                    <td><?php echo $row['product']; ?></td>
                </tr>
                <?php endwhile; ?>
            </tbody>
        </table>
        <br>
        <div class="pagination">
            <?php
            for ($page=1; $page <= $pages ; $page++) { 
                echo '<a style="color: #000000;
                        float: left;
                        padding: 8px 16px;
                        text-decoration: none;
                        "href="list.php?page='. $page .'">'. $page .'</a> ';
            }
            ?>
        </div>

【问题讨论】:

  • 你能再添加一个按钮来清除搜索吗?如果可能的话,您可以将发布的数据 $_POST['category'] 和 $_POST['product'] 保存到会话中,并检查会话是否可用,而不是应用 where 子句。并通过单击清除搜索按钮清除存储的会话。第二种方法是您可以通过 GET 而不是 POST 发送数据,如果数据可用,则将其附加到分页链接,在页面之后。
  • @AlokMali 我想采用第二种方法,你能给我一个代码示例来说明如何做到这一点。
  • 你的前 2 个 if 有问题。 if (!empty($c)){} else if (!empty($c) &amp;&amp; !empty($n){}。如果我没记错的话,else if 永远不会执行,因为如果$c 不为空,它将进入第一个if,如果$c 为空,那么它也不会执行@987654330 @ 或 elseif。 (我不认为这会导致您的问题,但我注意到了)
  • 并且mysql_query 已被弃用,不应使用。我强烈推荐PDO;但就目前而言,您的脚本对 sql 注入是开放的,因为变量直接打印到您的语句中,没有 mysqli_real_escape_string 或(更好)使用 PDO 或 mysqli 的参数化查询
  • 我一直盯着你的代码看了一会儿,我想不通。我不完全确定这里发生了什么。将您的代码分成两个脚本可能会有所帮助。一个脚本用于默认查询,另一个脚本用于类别。我也没有看到类别选择器的 html,也没有看到您的 ajax 请求所依赖的 html(带有 id=categoryid=product 的元素。

标签: php sql ajax


【解决方案1】:

将表单方法从 post 更改为 get,其中有类别选择和搜索按钮。

<form method="get"></form>

在服务器端获取类别和其他发布的值。

$c = $_GET['category'];
$n = $_GET['product'];

将这些值添加到分页

<div class="pagination">
        <?php
        $cat = $prod = '';
        if(!empty($_GET['category'])){ $cat = '&category='.$_GET['category']; }
        if(!empty($_GET['product'])){ $prod = '&product='.$_GET['category']; }
        for ($page=1; $page <= $pages ; $page++) { 
            echo '<a style="color: #000000;
                    float: left;
                    padding: 8px 16px;
                    text-decoration: none;
                    "href="list.php?page='. $page. $cat. $prod .'">'. $page .'</a> ';
        }
        ?>
    </div>

注意:如果'page'参数没有在搜索时发送,那么在你的搜索表单中设置一个输入命名页面。

<input type="hidden" name="page" value="<?php echo $page; ?>"

第二种方法是您可以将发布的值存储在 SESSION 中,并在单击新按钮清除搜索时清除会话。

第 1 步:在搜索按钮之外添加一个新按钮(清除搜索)。

第 2 步:将发布的类别和产品存储到会话中,并在查询中使用此会话。并在清除搜索按钮上销毁会话。

        <?php
        $listperpage = 15;
        $_SESSION['category'] = $_POST['category'];
        $_SESSION['product'] = $_POST['product'];
        /** clear_search is the name of your clear search button */
        if(isset($_POST["clear_search"])){
            unset($_SESSION['category']);
            unset($_SESSION['product']);
        }
        if(!empty($_SESSION['category'])){
            $query = "SELECT * FROM tbl_category INNER JOIN tbl_product ON tbl_category.id = tbl_product.fk_id_category WHERE fk_id_category = ". $_SESSION['category'];
            $result = mysql_query($query) or die (mysql_query());
        }
        else if(!empty($_SESSION['category']) && !empty($_SESSION['product'])){
            $query = "SELECT * FROM tbl_category INNER JOIN tbl_product ON tbl_category.id = tbl_product.fk_id_category WHERE fk_id_category = " .$_SESSION['category']. " AND rank_name = ". $_SESSION['product'];
            $result = mysql_query($query) or die (mysql_query());
        }else{
            $query = "SELECT * FROM tbl_category INNER JOIN tbl_product ON tbl_category.id = tbl_product.fk_id_category";
            $result = mysql_query($query) or die (mysql_query());
            echo "else one";
        }

        $result_num = mysql_num_rows($result);
        //total pages
        $pages = ceil($result_num/$listperpage);
        //which number the user is crrrently on 
        if (!isset($_GET['page'])) {
            $page = 1;
        } else{
            $page = $_GET['page'];
        }
        //sql limit starting number of results on th page
        $strt_limit_no = ($page - 1)*$listperpage;

        if(isset($_POST["search"])){
            if(empty($_SESSION['category'])){
                echo "<span class='form-error'>Select Category first!</span>";
            }
            else if(!empty($_SESSION['category']) && !empty($_SESSION['product'])){
                $queryn = "SELECT * FROM tbl_category INNER JOIN tbl_product ON tbl_category.id = tbl_product.fk_id_category WHERE fk_id_category = " .$_SESSION['category']. " AND rank_name = " . $_SESSION['product'] . " LIMIT ". $strt_limit_no .','. $listperpage;
                $results =  mysql_query($queryn) or die (mysql_query());
            }
            else{
                $queryn = "SELECT * FROM tbl_category INNER JOIN tbl_product ON tbl_category.id = tbl_product.fk_id_category WHERE fk_id_category = " .$_SESSION['category']. " LIMIT ". $strt_limit_no .','. $listperpage;
                $results =  mysql_query($queryn) or die (mysql_query());
            }
        }
        else{
            $queryn = "SELECT * FROM tbl_category INNER JOIN tbl_product ON tbl_category.id = tbl_product.fk_id_category LIMIT ". $strt_limit_no .','. $listperpage;
            $results = mysql_query($queryn) or die (mysql_query());
            echo "else end";
        }
    ?>

【讨论】:

  • 所以这不起作用@AlokMali。搜索现在不起作用,分页正在工作,但在转到第 2 页后,它显示默认结果并在 else 中显示查询结果。你能告诉如何使用会话吗?
  • @bro1o1,虽然第一个解决方案应该也可以,但我已经发布了另一个解决方案。
  • @bro1o1,你得到你想要的解决方案了吗?现在可以用了吗?
猜你喜欢
  • 2013-11-11
  • 1970-01-01
  • 2013-07-25
  • 2019-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-02
  • 2017-12-13
相关资源
最近更新 更多