PHP 实现分页原理详解

2016-01-28
次阅读
3 分钟阅读时长

分页在网站上面是一个必不可少的东西,例如在论坛上,只有几十张帖子那很好办,在一页显示就可以了,可是如果论坛有几千甚至几十万帖子的话,如果都在一页显示的话无论对浏览器还是用户都是一种折磨,而且如果数据上亿,从数据库里查询一次的话,对服务器的压力是很大的。所以就有了分页这个东西,接下来给大家讲一下如何实现分页。

假设我们有 100 条数据,要在每页中显示 10 条,这样的话就会分 10 页来显示,我们先看一看在 MySQL 里提取 10 条数据是如何操作的。

mysql_query("SELECT * FROM `article`  LIMIT 0, 10");

上面是一条很简单的数据库查询语句,它的意思就是从名叫 “article” 的表里面提取 10 条数据,细心的朋友可能已经知道了,这条查询语句最关键的就是 limt 0, 10。为了让你们更容易理解,我用 a 和 b 替换掉 0 和 10。limit a, b 就是从第a条记录开始,取出 b 条数据,a 表示从哪里开始取出数据,b 表示取多少条,也就是限定条件,限定他只能取多少条。假如一页显示 10 条数据,那么 b 就是 10,一页显示 20 条数据,b 就是 20。

看几个例子:

Limit 0,10        //第一页
Limit 10,10       //第二页
Limit 20,10       //第三页
Limit 30,10       //第四页

看出什么规律了吗?没错,每翻一页,第一个参数加 10,而第二个参数一直不变。

可能有人就会问,为什么第一个参数会变,而第二个参数不变呢?上面已经说过了,第一个参数表示从哪里开始,每翻一页加 10,这 10 条数据在上一页已经显示过了,所以就要加 10 从它的后面开始取出这一页数据。第二个参数因为我们要每一页都只显示 10 条数据,所以第二个数值一直不变。

也就是说,只要我们改变第一个参数的值就可以实现分页了,那我们要怎么改变呢?没错,用url的GET方式获取页数。例如 index.php?page=5 相信大家对这种url不陌生吧?可以说随处可见,其中的 page 参数就是要显示的页数。

看一小段代码:

$page = $_GET['page'];// 接受url中的page参数
if($page == ""){
    $page = 1;    //如果page不存在,那么页数就是1;
}
$page_size = 10;    //每页显示10条数据,也就是第二个参数

现在我们要获取数据库中到底有多少条数据,才能判断要分多少页,

具体的公式:总数据条数 除以 每页显示的条数等于总页数,也就是说 100/10=10,还有一种情况有余数, 10/3=3.3333 有余数存在总页数就要加1,所以总页数为4 。

计算页数代码:

$total = mysql_num_rows(mysql_query("SELECT * FROM `article`")); //查询总共有多少条数据
$page_num = ceil($total / $page_size);      //获得总页数 ( 总数据条数 除以 每页显示的条数 )
$offset = ($page - 1) * $page_size;    // 获取limit第一个参数, (传入的页数-1) * 每页显示的条数
//假如第一页则为(1-1)*10=0,第二页为(2-1)*10=10。
$info = mysql_query("SELECT * FROM `article` limit $offset, $page_size");   //获取相应页数所需要显示的数据

还有最后一步,显示分页信息,代码部分:

if ($page > 1) {
    echo '« 上页 ';
}
for ($i = 1; $i <= $page_num; $i++) {
    if ($i == $page) {
        echo '' . $i . ' ';
        continue;
    }
    echo '' . $i . ' ';
}
if ($page < $page_num) {
    echo '下页 » ';
}

这是一篇过去很久的文章,其中的信息可能已经有所发展或是发生改变。

本文作者:她和她的猫
本文地址https://her-cat.com/posts/2016/01/28/php-pagination/
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!