2017-11-08 2 views
-1

SQL 결과를 필터링하는 다중 확인란이 있습니다. 많은 레코드가 반환 될 것으로 예상되므로 페이지 매김을하고 싶습니다. 내 현재 페이지 매김 코드는 SELECT * FROM movies LIMIT {$startpoint} , {$per_page}과 같은 간단한 SQL 문에서만 작동합니다. 문제점은 SQL 결과에 대한 현재 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; 
}// 

Latest.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>"; 

이 그대로 현재 코드가 결과와 displays all results을 수행하지 Limit하는 checkbox is checked 경우, 필터는하지만 작동 페이지 매김 doesn, i.e no limit and link to next page gives the same result as the first. 필터링 된 결과를 페이지 매기기에 더 쉬운 방법이 있거나 현재 코드를 수정하는 방법이 있습니까? 나는 새로운 페이지 매김 해결책에 열려있다.

+0

[Datatables] (https://datatables.net/) 여기에 문제를 해결할 수있는 훌륭한 플러그인이 있습니다. 꽤 간단하고 좋은 문서를 가지고 있습니다. – Zaheen

답변

1

$ gendre, $ country 및 $ year는 절대로 함수에 전달되지 않으므로 가장 명백한 문제는 필터가 적용되지 않는다는 것입니다.

요청 개체에서 해당 값을 올바르게 읽으면 HTML의 태그를 살펴본 다음 두 가지 중 하나의 name 특성을 설정하지 않으므로 일반 전송을 사용하면 코드에 올바르게 전달되지 않는다고 생각합니다 . 우리가 jQuery 코드를 볼 수 없기 때문에 말하기가 약간 어렵지만, 이것이 jQuery에서 요청 매개 변수를 빌드 할 때 문제가되는 부분입니다.

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

첫째, 단지 필터를 추가 : 모든 필터 완료 후

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

하고, 실행하기 전에 쿼리이 추가이 같은 쿼리를 작성하는 경우

은 페이징을 해결하려면 :

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

디버깅을 위해이 바로 전에 $ query의 값을 출력 해보십시오 line :

1 페이지와 2 페이지에서 비교하여 아픈 엄지 손가락으로 튀어 나오는지 확인하십시오.

+0

나는 당신의 말을 이해하고 내일 이것을 선택할 수 있습니다. 그것의 11pm 여기에 롤 –

+0

위대한 대답은 정확히 내 코드에서 누락되었습니다 지적했다. '1.' 나는 필터를 통과하지 않고 페이지 매김의 URL에 도달했기 때문에 모든 결과를 얻었고 필터링 된 결과는 얻지 못했습니다. '2.' 당신이 제안한 쿼리를 변경했고'$ query. = "LIMIT {$ startpoint}, {$ per_page}"; '질의의 끝에서.감사합니다. –

+0

2 시간 안에 현상금을 수여합니다. –

0

타다 시브의 답변으로 충분합니다. 나는 그의 제안에 기초하여 변화를 기록한다.

   <?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과 관련이 없습니다.