PHP中的分页问题

时间:2014-05-06 17:06:30

标签: php mysql pagination

我的搜索有一个简单的分页脚本,但我遇到了一些麻烦。

当我更改页面时,查询返回初始定义。 类似的东西:

定义:Select * from a;

搜索:Select * from a where a.id = 1;

然后当我转到第二页时,查询就是:Select * from a;再次。

代码:我有一个表单,其中包含一些搜索字段,然后是脚本:

 $sqlCount_pre = "SELECT COUNT('*') FROM a ";
 $sqlCount_pre .= " INNER JOIN b ON a.id = b.id ";
 if( sizeof( $where ) ){
    $sqlCount_pre .= ' WHERE '.implode( ' AND ',$where );
 }

 $max = 2;
 $sqlCount = mysql_query($sqlCount_pre);
 $sqlResult = ceil(mysql_result($sqlCount, 0) / $max);
 $pg = (isset($_GET["pg"])) ? (int)$_GET["pg"] : 1 ;
 $start = ($pg - 1) * $max;
 $sqlQuery = "SELECT a.* FROM a ";
 $sqlQuery .= " INNER JOIN b ON a.id = b.id ";

 if( sizeof( $where ) ){
    $sqlQuery .= ' WHERE '.implode( ' AND ',$where );
    $sqlQuery .= " LIMIT $start, $max";
 }else{
    $sqlQuery .= " LIMIT $start, $max";
 }

$sql = mysql_query($sqlQuery) or die(mysql_error());

然后我在页面中显示结果。 之后我把页面链接,如下代码所示:

<?php
   if($sqlResult > 1 && $pg<= $sqlResult){
       for($i=1; $i<=$sqlResult; $i++){
           echo "<a href='?pg=$i'>$i</a> ";
       }
   }       
?>

此代码中是否有错误或缺失?

2 个答案:

答案 0 :(得分:0)

is_int()doc是here

$pg = (isset($_GET["pg"]) && is_int($_GET["pg"])) ? (int)$_GET["pg"] : 1 ;

当然,没有理由(int)...因为我们已经将$ _GET [“pg”]建立为int,所以类型转换没有实际意义。

$pg = (isset($_GET["pg"]) && is_int($_GET["pg"]) &&  $_GET["pg"] > 0) ? $_GET["pg"] : 1 ;

如果

,则返回1
$_GET["pg"]

返回一串数字,如“42”。对于替代和is_numeric以及两者的描述和比较,请查看此article

如果GET返回一个字符串

pg_escape_string($_GET["pg"])

pg_escape_string doc

回到原来的问题。更改页面时,不会执行限制。因此,不设置偏移量和最大值。看一下你点击第二页时执行的查询。你正确计算偏移量了吗?

你只是在

中指定$ pg
  echo "<a href='?pg=$i'>$i</a> "; 

你必须输入搜索词以将其传递给$ where数组。如果不这样做,计数将为0,这就是内爆不会发生的原因。

多个变量here

答案 1 :(得分:0)

将搜索表单与分页结合使用时,需要将搜索参数嵌入到分页链接中。

<?php
   if($sqlResult > 1 && $pg<= $sqlResult){
       $query = $_GET;
       for($i=1; $i<=$sqlResult; $i++){
           $query['pg'] = $i;
           echo "<a href='?" . http_build_query($query) ."'>$i</a> ";
       }
   }       
?>

上面的代码会将当前查询字符串中的所有内容都包含在内,并在构建分页链接时添加适用的pg属性。

- 编辑 -
将POST搜索表单与分页相结合有点奇怪。你可以做几件事:

使用javascript填充隐藏的&#34;页面&#34;单击其中一个分页链接时表单中的字段,然后重新提交表单,例如:

$('.pagination-link').on('click', function() {
    $('#page').val($(this).html());  //where you have a hidden field #page
    $('$searchform').submit();
});


将表单方法更改为GET,并使用我上面发布的示例