【问题标题】:Paginating a dynamic SQL result对动态 SQL 结果进行分页
【发布时间】:2018-04-20 23:15:59
【问题描述】:

我有多个用于过滤 SQL 结果的复选框。我会期待返回很多记录,所以我想给它分页。我当前的分页代码仅适用于简单的 SQL 语句,例如 SELECT * FROM movies LIMIT {$startpoint} , {$per_page} 问题是我无法让它与我当前的 jquery 过滤器一起工作以获取我的 SQL 结果。

分页功能

   // Pagination Function
   function pagination($query,$per_page=10,$page=1,$url='?'){   
global $conDB; 
$query = "SELECT COUNT(*) as `num` FROM movies";
$row = mysqli_fetch_array(mysqli_query($conDB,$query));
$total = $row['num'];
$adjacents = "2"; 

$prevlabel = "‹ Prev";
$nextlabel = "Next ›";
$lastlabel = "Last ››";

$page = ($page == 0 ? 1 : $page);  
$start = ($page - 1) * $per_page;                               

$prev = $page - 1;                          
$next = $page + 1;

$lastpage = round($total/$per_page);

$lpm1 = $lastpage - 1; // //last page minus 1

$pagination = "";
if($lastpage > 1){   
    $pagination .= "<ul class='pagination'>";


        if ($page > 1) $pagination.= "<li><a href='{$url}page={$prev}'>
  {$prevlabel}</a></li>";

    if ($lastpage < 7 + ($adjacents * 2)){   
        for ($counter = 1; $counter <= $lastpage; $counter++){
            if ($counter == $page)
                $pagination.= "<li><a class='current'>{$counter}</a> 
    </li>";
            else
                $pagination.= "<li><a href='{$url}page={$counter}'>
    {$counter}</a></li>";                    
        }

    } elseif($lastpage > 5 + ($adjacents * 2)){

        if($page < 1 + ($adjacents * 2)) {

            for ($counter = 1; $counter < 4 + ($adjacents * 2); 
        $counter++){
                if ($counter == $page)
                    $pagination.= "<li><a class='current'>{$counter}
           </a></li>";
                else
                    $pagination.= "<li><a href='{$url}page={$counter}'>
      {$counter}</a></li>";                    
            }
            $pagination.= "<li class='dot'>...</li>";
            $pagination.= "<li><a href='{$url}page={$lpm1}'>{$lpm1}</a>
      </li>";
            $pagination.= "<li><a href='{$url}page={$lastpage}'>
      {$lastpage}</a></li>";  

        } elseif($lastpage - ($adjacents * 2) > $page && $page > 
      ($adjacents * 2)) {

            $pagination.= "<li><a href='{$url}page=1'>1</a></li>";
            $pagination.= "<li><a href='{$url}page=2'>2</a></li>";
            $pagination.= "<li class='dot'>...</li>";
            for ($counter = $page - $adjacents; $counter <= $page +
        $adjacents; $counter++) {
                if ($counter == $page)
                    $pagination.= "<li><a class='current'>{$counter}
         </a></li>";
                else
                    $pagination.= "<li><a href='{$url}page={$counter}'>
          {$counter}</a></li>";                    
            }
            $pagination.= "<li class='dot'>..</li>";
            $pagination.= "<li><a href='{$url}page={$lpm1}'>{$lpm1}</a>
        </li>";
            $pagination.= "<li><a href='{$url}page={$lastpage}'>
       {$lastpage}</a></li>";      

        } else {

            $pagination.= "<li><a href='{$url}page=1'>1</a></li>";
            $pagination.= "<li><a href='{$url}page=2'>2</a></li>";
            $pagination.= "<li class='dot'>..</li>";
            for ($counter = $lastpage - (2 + ($adjacents * 2));
           $counter <= $lastpage; $counter++) {
                if ($counter == $page)
                    $pagination.= "<li><a class='current'>{$counter}
        </a></li>";
                else
                    $pagination.= "<li><a href='{$url}page={$counter}'>
       {$counter}</a></li>";                    
            }
        }
    }

        if ($page < $counter - 1) {
    $pagination.= "<li><a href='{$url}page={$next}'>{$nextlabel}</a>
     </li>";
    $pagination.= "<li><a href='{$url}page=$lastpage'>{$lastlabel}</a>
      </li>";
      }

    $pagination.= "</ul>";        
       }

return $pagination;
}//

最新的.php

 $page = (int)(!isset($_GET["page"]) ? 1 : $_GET["page"]);
 if ($page <= 0) $page = 1;

 $per_page = 2; // Set how many records do you want to display per page.

$startpoint = ($page * $per_page) - $per_page;

$statement = "`movies` ORDER BY `m_id` ASC";  

            $con = mysqli_connect("localhost","root","","blabla");
       $mysqli = new mysqli("localhost", "root", "", "blabla");


         $db_username = 'root'; 
         $db_password = ''; 
         $db_name = 'blabla'; .
         $db_host = 'localhost';

         $conDB = mysqli_connect($db_host, $db_username, 
          $db_password,$db_name)or die('Error: Could not connect to
          database.');


         if (mysqli_connect_errno())
        {

         echo "Failed to Connect to MySQL:" . mysqli_connect_error();
         }


        $results2 = $mysqli->query( "select distinct(m_genre) 
        from movies where movie_status = '1'");  

         while($genre_data = mysqli_fetch_assoc($results2)){

            ?>

                <a href="javascript:void(0);" class="list-group-item"> 
                <label> 
                <input type="checkbox" class="item_filter genre" 
            value="<?php echo $genre_data['m_genre']; ?>" <?php
            if(in_array($genre_data['m_genre'],$genre)){ echo"checked";
             } ?> >
         <span class="check-box-effect"></span>
                &nbsp;&nbsp; <?php echo $genre_data['m_genre']; ?>
       </label></a>

            <?php } ?>  
            </div>



            <div class="col-xs-4">
            <h3>Country</h3>
            <?php 
                $rs = $mysqli->query("select distinct(m_country) 
            from movies where movie_status = '1'");  

                while($country_data = mysqli_fetch_assoc($rs)){

            ?>
                <a href="javascript:void(0);" class="list-group-item"> 
                <input type="checkbox" class="item_filter country"
        value="<?php echo $country_data['m_country']; ?>" <?php 
        if(in_array($country_data['m_country'],$country)){ 
        echo"checked"; } ?> >
                &nbsp;&nbsp; <?php echo $country_data['m_country']; 
             ?>     </a>
            <?php } ?>  
            </div>

            <div class="col-xs-4">
            <h3>Year</h3>
            <?php 
                $rs = $mysqli->query( "select distinct(m_year) 
               from movies where movie_status = '1'");  

                while($year_data = mysqli_fetch_assoc($rs)){

            ?>
                <a href="javascript:void(0);" class="list-group-item"> 
                <input type="checkbox" class="item_filter year" 
                value="     <?php echo $year_data['m_year']; ?>"
              <?php if(in_array($year_data['m_year'],$year))
               { echo"checked"; } ?> >
                &nbsp;&nbsp; <?php echo $year_data['m_year']; ?></a>
            <?php } ?>  
            </div>

            </div>
          </div>
          </div>



            <div class="row">
               <div class="col-xs-12">
              <?php 


                 $query = "SELECT * FROM movies 
          WHERE movie_status = '1'"; 
                  //filter query start 
                  if(!empty($genre)){
                      $genredata =implode("','",$genre);
                      $query  .= " and m_genre in('$genredata') LIMIT {$startpoint} , {$per_page} "; 
                  }

                   if(!empty($country)){
                      $countrydata =implode("','",$country);
                      $query  .= " and m_country in('$countrydata') LIMIT {$startpoint} , {$per_page} "; 
                  }

                  if(!empty($year)){
                      $yeardata =implode("','",$year);
                      $query  .= " and m_year in('$yeardata') LIMIT 
            {$startpoint} , {$per_page} "; 
                  }
                //filter query end 

                 $rs = mysqli_query($mysqli,$query) or die("Error : 
   ".mysqli_error($mysqli));
  while(){

     ............................
            }
   echo '<div class= "wrap">';
   // displaying paginaiton.

   echo pagination($statement,$per_page,$page,$url='?');

   echo "</div>";

当前代码不是Limit 结果和displays all results,如果checkbox is checked,过滤器工作但分页不起作用,i.e no limit and link to next page gives the same result as the first。有没有更简单的方法来对我的过滤结果进行分页或如何修复我当前的代码。我对新的分页解决方案持开放态度。

【问题讨论】:

  • Datatables 这里有一个很棒的插件可以解决你的问题。它非常简单,并且有很好的文档。

标签: php jquery html sql pagination


【解决方案1】:

Tadasbub 的回答应该足够了。我只是根据他的建议写出更改。

              <?php 


             $query = "SELECT * FROM movies 
      WHERE movie_status = '1'"; 
              //filter query start 
              if(!empty($genre)){
                  $genredata =implode("','",$genre);
                  $query  .= " and m_genre in('$genredata')"; 
              }

               if(!empty($country)){
                  $countrydata =implode("','",$country);
                  $query  .= " and m_country in('$countrydata')"; 
              }

              if(!empty($year)){
                  $yeardata =implode("','",$year);
                  $query  .= " and m_year in('$yeardata')"; 
              }
            //filter query end 
             $query .= " LIMIT {$startpoint} , {$per_page} ";
             $rs = mysqli_query($mysqli,$query) or die("Error : ".mysqli_error($mysqli));

只需更改此处所写的查询块即可。它应该可以按您的预期工作。

顺便说一句,问题仅在于 php 逻辑。与sql/mysql无关。

【讨论】:

    【解决方案2】:

    最明显的问题是您的过滤器永远不会应用,因为 $gendre、$country 和 $year 永远不会传递给函数。

    假设您从请求对象中正确读取了这些值,请查看 HTML 中的标签,您从未为它们中的任何一个设置名称属性,因此我认为如果您使用常规提交,它们永远不会正确传递给代码。很难说,因为我们看不到 jQuery 代码,但我认为这就是问题所在 - 在 jQuery 中构建您的请求参数。

    要修复分页,当您构建这样的查询时:

       $query  .= " and m_country in('$countrydata') LIMIT {$startpoint} , {$per_page} "; 
    

    首先,只添加过滤器:

       $query  .= " and m_country in('$countrydata') "; 
    

    然后在所有过滤器完成后,在执行查询之前添加:

       $query  .= " LIMIT {$startpoint} , {$per_page} "; 
    

    出于调试目的,请考虑在此行之前打印出 $query 的值:

       $rs = mysqli_query($mysqli,$query) or die("Error : ".mysqli_error($mysqli));
    

    并在第 1 页和第 2 页上比较它们,看看是否有什么突出的拇指疼痛。

    【讨论】:

    • 我明白你的意思,明天可以取这个。晚上 11 点在这里大声笑
    • 很好的答案,准确地指出了我的代码中缺少的内容。 1. 我没有将过滤器传递给分页的 url,这就是为什么我一直得到所有结果而不是过滤后的结果。 2. 我还按照您的建议更改了查询并退出了 ` $query .= " LIMIT {$startpoint} , {$per_page} "; ` 在查询的末尾。谢谢
    • 我会在 2 小时内将赏金奖励给你,因为它现在不允许我这样做
    猜你喜欢
    • 2019-12-23
    • 1970-01-01
    • 2018-04-03
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    相关资源
    最近更新 更多