【问题标题】:How to fix pagination problem with filter in PHP and SQL?如何解决 PHP 和 SQL 中过滤器的分页问题?
【发布时间】:2019-12-15 13:08:47
【问题描述】:

这里是PHP爱好者..

我有一个脚本,它在其中执行查询并将整个数据库行放入表格单元格并进行分页。

问题是当用户在搜索框中输入内容以过滤分页时,它仅在显示过滤结果的第 1 页有效,但在第 2 页停止工作,第 2 页返回所有分页结果并忽略过滤器。

如何将过滤器值带入 url,使其在整个分页中保持不变?

很抱歉,我只是想不通

<?php require('includes/config.php');

//if not logged in redirect to login page
if(!$user->is_logged_in()){ header('Location: index.php'); exit(); }

//include header template
require('layout/header.php'); 

 $stmt = $db->query("SELECT name, last_name FROM `designers` WHERE `username` = '" . $_SESSION['username'] . "'");
 $result1 = $stmt->fetch(PDO::FETCH_ASSOC); 
 $name = $result1['name'];
 $last_name = $result1['last_name'];

      if (isset($_GET['pageno'])) {
        $pageno = $_GET['pageno'];
    } else {
        $pageno = 1;
    }
    $no_of_records_per_page = 15;
    $offset = ($pageno-1) * $no_of_records_per_page;
    $conn=mysqli_connect("xxxx", "xxxx", "xxxx", "xxxx");
    $total_pages_sql = "SELECT COUNT(*) FROM protonumbers WHERE designer LIKE '".$name.'_'.$last_name."'";
    $result = mysqli_query($conn,$total_pages_sql);
    $total_rows = mysqli_fetch_array($result)[0];
    $total_pages = ceil($total_rows / $no_of_records_per_page);

?>
<style>
table {
border-collapse: collapse;
width: 100%;
}

th, td {
text-align: center;
padding: 8px;
}

tr:nth-child(even){background-color: #f2f2f2}

th {
background-color: #428bca;
color: white;
}
</style>
<div class="container">

<div class="row">
    <div class="col-xs-12 col-sm-8 col-md-6 col-sm-offset-2 col-md-offset-3">
        <form action="search.php" autocomplete="off" method="post">
            <h3>My Proto Numbers</h3><hr><br>
                            <?php
            //check for any errors
            if(isset($error)){
                foreach($error as $error){
                    echo '<p class="bg-danger">'.$error.'</p>';
                }
            }
            ?>
            </div>
            </div>
     </div>
            <?php

if(isset($_POST['search']))
{
$valueToSearch = $_POST['valueToSearch'];
// search in all table columns
// using concat mysql function
$query = "SELECT * FROM `protonumbers` WHERE UPPER(CONCAT(`brand`, `protoID`, `season`, `program`, `protonumber`)) LIKE UPPER('%".$valueToSearch."%') AND designer LIKE '".$name.'_'.$last_name."' LIMIT $offset, $no_of_records_per_page";
$search_result = filterTable($query);
}
else {
$query = "SELECT * FROM `protonumbers` WHERE designer LIKE '".$name.'_'.$last_name."' LIMIT $offset, $no_of_records_per_page";
$search_result = filterTable($query);
}

// function to connect and execute the query
function filterTable($query)
{
$connect = mysqli_connect("xxxx", "xxxx", "xxxx", "xxxx");
$filter_Result = mysqli_query($connect, $query);
return $filter_Result;
}

?>
<div class="container">
<div class="row">
    <div class="col-xs-12 col-sm-8 col-md-6 col-sm-offset-2 col-md-offset-3">
            <div class="form-group">
                <input type="text" name="valueToSearch" class="form-control input-lg" placeholder="Search by Proto number, Season, Brand, Program" tabindex="1">

            <div class="row"><br />
                <div class="col-xs-6 col-md-6">
                    <input type="submit" name="search" value="Search" class="btn btn-primary btn-block btn-lg" tabindex="2"> . 
  </form></div></div></div></div>
                     <div class="col-xs-12 col-sm-8 col-md-6 col-sm-offset-2 col-md-offset-3">
                                            <a href="index.php">Back</a><br><br>        <ul class="pagination">
    <li><a href="?pageno=1">First</a></li>
    <li class="<?php if($pageno <= 1){ echo 'disabled'; } ?>">
        <a href="<?php if($pageno <= 1){ echo '#'; } else { echo "?pageno=".($pageno - 1); } ?>">Prev</a>
    </li>
    <li class="<?php if($pageno >= $total_pages){ echo 'disabled'; } ?>">
        <a href="<?php if($pageno >= $total_pages){ echo '#'; } 
else { echo "?pageno=".($pageno + 1); } ?>">Next</a>
    </li>
    <li><a href="?pageno=<?php echo $total_pages; ?>">Last</a></li>
</ul> 
            <table>
            <tr>
                <th>ProtoID</th>
                <th>Brand</th>
                <th>Season</th>
                <th>Program</th>
                <th>Proto Number</th>
            </tr>

  <!-- populate table from mysql database -->
            <?php while($row = 
mysqli_fetch_array($search_result)):?>
            <tr>
                <td><?php echo $row['protoID'];?></td>
                <td><?php echo $row['brand'];?></td>
                <td><?php echo $row['season'];?></td>
                <td><?php echo $row['program'];?></td>
                <td><?php echo $row['protonumber'];?></td>
            </tr>
            <?php endwhile;?>
        </table>

                </div></div>

<?php
//include header template
require('layout/footer.php');
?>

【问题讨论】:

  • HTTP 是无状态的。您需要保留过滤器。将它们作为参数保存在 URI 上或存储在会话中。
  • 因此,例如,如果在 last_name 上设置了约束,则在呈现页面 2 的页面链接时,您将附加 pagenolast_name... 可能类似于href="&lt;?= "?last_name={$last_name}&amp;page=2"... 您的链接可共享的额外好处.. 即我可以通过电子邮件向您发送指向我所看到的相同结果的链接。
  • @ficuscr 是的,那真的很有帮助。我只是坚持如何附加它们。我想向您展示整个脚本,以便您也看到 HTML
  • 得到其余代码了吗?片段在哪里呈现分页链接?否则我可以对其进行伪编码。这是DataTables 之类的东西还是自制的?
  • @ficuscr 这是自制的呵呵。我编辑了原始帖子并添加了剩余的代码

标签: php sql filter pagination


【解决方案1】:

好的,因此,正如 cmets 中所述,这归结为 HTTP 不是有状态的,您需要跨请求保留这些过滤器值。因此,将内容存储在会话中,或者只是将 URI 查询字符串保持在状态。

所以构建查询字符串...

<?php
    $assignedFilters = [];
    if (!empty($name)) $assignedFilters['name'] = $name;
    if (!empty($last_name)) $assignedFilters['last_name'] = $last_name;
    $filterParams = http_build_query($assignedFilters);
?>

然后将它放在分页链接的 href 上...这是一个示例

  <a href="<?php if($pageno <= 1) { echo '#'; 
} else { 
  echo "?pageno=".($pageno - 1) . '&' . $filterParams; } ?>">Prev</a>


换句话说,将. '&amp;' . $filterParams 附加到您现有的分页链接。

【讨论】:

  • 我想使用部分中的输入进行过滤 。用户在搜索框中输入的任何内容都会过滤掉页面中的分页。
  • 嗯。首先我听说了。也许那应该是你的问题?
  • 我应该!我以为我写了哈哈,我的坏。目前,它按名称和姓氏自动过滤,这不是问题,当用户在文本框中键入过滤器并单击搜索时,问题就开始了,然后它在第一页上显示结果很好,但是当您单击其他页面时,它会删除查询并显示所有内容
  • 我试图用我的回答来说明同样的概念。将文本&lt;input /&gt;value 设置为在呈现之前提交的内容 - 这样它将“持续存在”。 FWIW:stackoverflow.com/questions/3105296/…
猜你喜欢
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 2013-06-15
  • 2015-12-03
  • 1970-01-01
相关资源
最近更新 更多