在php中分页

时间:2010-01-13 21:26:47

标签: php sql pagination

我用这个来收集特定用户的评论。我想在每个页面上显示7条评论,并希望启用分页。 实施的步骤是什么?抱歉。 n00b问题。

$query = "SELECT msg, user_id, comment_time FROM comments WHERE aid = '$aid' ORDER BY comment_time DESC";
        $result = mysql_query($query) or die("ERROR: $query.".mysql_error());
        if (mysql_num_rows($result) > 0) {
            while($row = mysql_fetch_object($result)){
                $uidval = $row->user_id;
                if ($uidval != 0){
                $userInfo = $facebook->api_client->fql_query("SELECT name, pic_square_with_logo, profile_url FROM user WHERE uid='".$uidval."'");

            //  echo '<br>Array Info<br>';
            //  print_r($userInfo);
            //  echo '<br><br>';

                $nameuser = $userInfo[0]['name'];
                $pic = $userInfo[0]['pic_square_with_logo'];
                $profile_url = $userInfo[0]['profile_url'];

                echo '<img src="'.$pic.'" />';
                echo '<a href="'.$profile_url.'">'.$nameuser.'</a>';
                echo '<br>';
                echo $row->comment_time;
                echo '<br>';
                echo $row->msg;
                echo '<br>';
                }

            }
        }

4 个答案:

答案 0 :(得分:4)

最好通过SQL的limit / offset子句实现解决方案。对于MySQL,这可以通过在查询中附加LIMIT [offset] [count]来实现。 PostgreSQL使用单独的select ... LIMIT [count] OFFSET [offset]语法。

您的想法是将返回的结果数限制为您想要显示的实际数字。如果你显示200页的第1页,每页有100个结果,它可以产生巨大的性能提升。

当然,您需要运行第二个查询 - select count(*) from ...来确定结果集中的结果数。除以每页的结果数,你就得到了页数。

您可能希望在查询字符串中传递页面参数,例如

http://mysite.com/index.php?page=7

然后使用类似的方法拉取数据(考虑这个伪代码;我知道我实际上并没有正确查询)

<?php

$num_per_page = 20; // 20 results per page

$page = isset($_GET['page']) ? $_GET['page'] : 0; // start from page 0

// Build our big query minus the SELECT part here
$from_part = 'tbl_results [where ...]"'

$num_results = query("SELECT COUNT(*) FROM $from_part");

// Use ceil to round upwards
$num_pages = ceil($num_results / $num_per_page);

// Cap the page a the last page
if ($page > $num_pages)
  $page = $num_pages;

// Cap the page at the first page
if ($page <= 1)
  $page = 1;

$offset = $page * $num_per_page;

// Build the final query to select the relevant page of data
$results = query("SELECT * FROM $from_part LIMIT $offset, $num_per_page");

?>

答案 1 :(得分:3)

这是您实现分页的基本方法:

// Page number, >= 1, could come from $_GET for example
$page = 1;
// Amount of items to show on page
$perpage = 7;
// Calculate the index of first item to show,
// on page 1 we obviously want to start from 0, hence the - 1 part
$start = ($page - 1) * $perpage;
// Build the query using those variables
$query = "SELECT ... LIMIT $start, $perpage";

当然,您必须先考虑表格中的项目数量并调整页面变量等来考虑最大和最小页码,但这应该可以让您开始。

答案 2 :(得分:0)

使用LIMIT x,y表示要作为页面提取的第一个和多个记录。

答案 3 :(得分:0)

虽然学习分页是一个值得努力的新手,但我强烈建议使用已编写的代码。查看PEAR,Zend Framework或任何其他库的集合以实现分页。

以上示例很好地解释了分页的工作原理,但完全忽略了安全实践,可维护性以及生产质量代码中的其他因素。我没有点燃上述评论者,我说他们没有时间为你编写生产质量代码,因此不使用他们的例子(复制粘贴)。

通过擦除GET参数和安全数据库抽象层的内容,安全性非常必要。您还必须处理有人手动输入超出范围或低于范围的值的边缘情况。

如今,大多数上述问题都是由框架(如KohanaPHP,Zend Framework,CakePHP,&...等)处理的。