当添加不同的sql查询条件时,Pagination Php不起作用

时间:2013-10-30 22:23:47

标签: php pagination

您好我的分页系统遇到问题,如果我从mysql表中列出结果它工作正常,但万一如果我在SQL查询中添加一些条件,如“AND”这个列“AND”其他列脚本在第一页上正确显示结果,当我选择第二页而不是显示26的结果的第二部分时,它开始一个新的分页,它显示从开始没有在查询中添加的contions的所有内容。以下是查询分页的代码:

 //This gets all the other information from the form 
 $ciudad=$_POST['ciudad']; 
 $tipo=$_POST['tipo']; 

$con=mysqli_connect();
// Check connection
$sql = "SELECT * FROM cursos WHERE 1";
if (!empty($ciudad)) {
  $sql .= " AND ciudad = '$ciudad' ";
}
if (!empty($tipo)) {
  $sql .= " AND tipo= '$tipo' ";
}
if (!$result = mysqli_query($con,$sql))
{
    die("Error: " . mysqli_error($con));
}

$per_page =25;//define how many games for a page
$count = mysqli_num_rows($result);
$pages = ceil($count/$per_page);

if(!isset($_GET['page']) || $_GET['page']=="") {
  $page="1";
} else {
  $page=$_GET['page'];
}
$start    = ($page - 1) * $per_page;
$sql = "SELECT * FROM cursos WHERE 1 LIMIT $start,$per_page";

?>

这是生成的页面链接的代码:

<?php
        //Show page links
        for ($i = 1; $i <= $pages; $i++)
          {?>
          <li id="<?php echo $i;?>"><a href="search_cursos.php?page=<?php echo $i;?>"><?php echo $i;?></a></li>
          <?php           
          }
        ?>

3 个答案:

答案 0 :(得分:1)

如果$ ciudad和$ tipo都不为空,那么执行时的查询将如下所示:

SELECT * FROM cursos WHERE 1 AND ciudad = '$ciudad' ORDER BY id DESC AND tipo= '$tipo' ORDER BY id DESC 

如果我没弄错的话应该是这样的:

SELECT * FROM cursos WHERE 1 AND ciudad = '$ciudad' AND tipo= '$tipo' ORDER BY id DESC

我要做的就是改变这一点:

$sql = "SELECT * FROM cursos WHERE 1";
if (!empty($ciudad)) {
  $sql .= " AND ciudad = '$ciudad' ORDER BY id DESC ";
}
if (!empty($tipo)) {
  $sql .= " AND tipo= '$tipo' ORDER BY id DESC ";
}

这也是:

$sql = "SELECT * FROM cursos WHERE 1 ";
if (!empty($ciudad)) {
    $sql .= "AND ciudad= '$ciudad' ";
    if (!empty($tipo)) {
       $sql .= "AND tipo= '$tipo' ";
    }

      $sql .= "ORDER BY id DESC ";
    }

我还有一个链接,可以帮助你分页。

http://www.phpjabbers.com/php--mysql-select-data-and-split-on-pages-php25.html

答案 1 :(得分:1)

其中的两个问题:

  • 在下一页中不再选择其他过滤器($_POST将为空)
  • 与查询后计算的分页相关的说明(显然,不能使用这些参数)

您可以在会话中存储额外的查询条件,或将其作为参数添加到“下一页链接”中,或将链接转换为提交表单(这可能是最佳选择)

<li id="<?php echo $i;?>"><a href="search_cursos.php?page=<?php echo $i.'&amp;ciudad='.$ciudad.'&amp;tipo='.$tipo; ?>"><?php echo $i;?></a></li>

如果您选择了链接解决方案,请不要忘记更改_POST中的_GET(如果第一个为空,请检查第二个,或使用$_REQUEST

我必须提到你的代码不是sql注入免费并且使用mysqli_prepare()可能值得花时间(用于安全性和性能)

编辑:所以,我们走了:

旁注:并不总是建议使用$_REQUEST

我注意到你在使用分页系统之前也执行了你的查询......

 //This gets all the other information from the form 
 $ciudad=$_REQUEST['ciudad']; 
 $tipo=$_REQUEST['tipo']; 

$con=mysqli_connect();
// Check connection
$sql = "SELECT * FROM cursos WHERE 1";
if (!empty($ciudad)) {
  $sql .= " AND ciudad = '$ciudad' ";
}
if (!empty($tipo)) {
  $sql .= " AND tipo= '$tipo' ";
}

//  PAGINATION MOVED UP

$per_page =25;//define how many games for a page
$count = mysqli_num_rows($result);
$pages = ceil($count/$per_page);

if(empty($_GET['page'])) {
  $page="1";
} else {
  $page=$_GET['page'];
}
$start    = ($page - 1) * $per_page;

$sql .= ' LIMIT '.$start.','.$per_page;

if (!$result = mysqli_query($con,$sql))
{
    die("Error: " . mysqli_error($con));
}



        //Show page links
        for ($i = 1; $i <= $pages; $i++)
          {?>
          <li id="<?php echo $i;?>"><a href="search_cursos.php?page=<?php echo $i.'&amp;ciudad='.$ciudad.'&amp;tipo='.$tipo; ?>"><?php echo $i;?></a></li>
          <?php           
          }
        ?>

答案 2 :(得分:0)

如果设置了城市和类型,那么您的SQL将有两个订单实例...您应该在if语句之后添加订单。