PHP 分页技术

1. PHP 数据显示分页技术

数据分页概述
对大量数据进行分页显示是 Web 开发中最常见的情况,但大多刚开始接触 Web 开发的开发人员,对分页技术往往比较迷惘,本节教程以一个分页显示留言板的数据为例就来演示一下 PHP 中基本的数据分页显示原理。
本节教程需要用到的 PHP基础知识 :
PHP 预定义 $GET 变量来接收 URL 参数信息,具体参见《PHP $GET》。
if 流程控制,具体参见《PHP if … else 流程控制》。
MySQL 数据库表基础知识,具体参见《MySQL 基本概念》。
MySQL 数据查询,具体参见《MySQL Select From 查询数据》
MySQL 数据查询,具体参见《MySQL LIMIT 限定查询记录数》。
数据准备
假设储存留言的数据表(guestbook)数据如下:
id nickname email content createtime
1 admin [email protected] 留言测试 1264167501
2 user [email protected] 大家好 1264168127
3 小明 [email protected] 做得好,继续努力。。 1264168865
4 小张 [email protected] 来看看 1264169118
5 小丽 [email protected] haha 1283276566
6 Tom [email protected] Hello 1283336218
7 Jack [email protected] okok 1283336315
8 admin [email protected] 嗯嗯 1283336315
9 阿里巴巴 [email protected] 来看看 1283337158
10 路人甲 [email protected] 哈哈哈 1283338228
建表 SQL 参考如下:
CREATE TABLE guestbook (
id mediumint(8) unsigned NOT NULL auto_increment,
nickname char(15) NOT NULL default '',
email varchar(100) NOT NULL default '',
content text NOT NULL,
createtime int(10) unsigned NOT NULL default '0',
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
分页原理
目的很简单,就是将较多数据记录,分页显示出来,每一页显示设定的数据条数。
分页显示格式如下:
共 10 条留言 [1] 2 3
该格式比较简单,只显示了总的数据和各个分页数。当前页面显示为 [1] 这样的格式,非当前页面的页数则显示为超链接格式。
PHP 分页技术核心在于确定当前的页数,然后利用 MySQL 的 LIMIT 关键字来指定输出对应的记录数。
如当前是第 1 页时,那么就是 LIMIT 0,4(假设一页输出 4 条记录),第 2 页时,就是 LIMIT 4,4,第 3 页时,就是 LIMIT 8,4 … 依此类推,第 n 页时,就是 LIMIT (n-1)*4,4 。
而当前页数 $p 这个参数,通过 URL 来获取。如 http://127.0.0.1/guestbook/index.php?p=2 这个这个 URL 链接,表示当前为第 2 页,PHP 中通过 $_GET['p'] 来取得对应的页数值 2 。而对于首页,则没有 $p 这个参数,那么就设定为默认值 1 即可。

  1. 分页代码实现

    数据库链接及参数设定 //数据库连接
    @mysql_connect("localhost","root","root123") or die("连接数据库失败:".mysql_error());
    
    mysql_select_db("test");
    
    mysql_query("set character set 'gbk'");
    
    //每页显示的留言数 $pagesize = 4; 输出当前页数据 //确定当前页数 $p 参数 $p = $GET['p']?$GET['p']:1; //数据指针 $offset = ($p-1)*$pagesize; //查询本页显示的数据 $query_sql = “SELECT * FROM guestbook ORDER BY id DESC LIMIT $offset , $pagesize”; $result = mysql_query($query_sql); //循环输出 while($gblist = mysql_fetch_array($result)){
    echo '<a href="',$gblist['nickname'],'">',$gblist['nickname'],'</a> ';
    
    echo '发表于:',date("Y-m-d H:i", $gblist[createtime]),'<br />';
    
    echo '内容:',$gblist['content'],'<br /><hr />';
    
    }

确定当前页参数 $p 中,使用了一个三元运算符:
$p = $GET['p']?$GET['p']:1;
可以这么通俗的理解该运算符:$GET['p'] 存在吗?如果存在,那么 $p = $GET['p'] ,如果不存在,那么 $p = 1 。
接下来就是读取当前页面显示数据的具体代码,该部分可参考《MySQL Select From 查询数据》。
输出分页格式


//分页代码
<!-- lang: php -->
//计算留言总数
<!-- lang: php -->
$count_result = mysql_query("SELECT count(*) as count FROM guestbook");
<!-- lang: php -->
$count_array = mysql_fetch_array($count_result);
<!-- lang: php -->

<!-- lang: php -->
//计算总的页数
<!-- lang: php -->
$pagenum=ceil($count_array['count']/$pagesize);
<!-- lang: php -->
echo '共 ',$count_array['count'],' 条留言';
<!-- lang: php -->

<!-- lang: php -->
//循环输出各页数目及连接
<!-- lang: php -->
if ($pagenum > 1) {
<!-- lang: php -->
    for($i=1;$i<=$pagenum;$i++) {
<!-- lang: php -->
        if($i==$p) {
<!-- lang: php -->
            echo ' [',$i,']';
<!-- lang: php -->
        } else {
<!-- lang: php -->
            echo ' <a href="index.php?p=',$i,'">',$i,'</a>';
<!-- lang: php -->
        }
<!-- lang: php -->
    }
<!-- lang: php -->
}

如果确定页数大于 1 ,则开始输出分页页码。如果是当前页码,这输出 [2] 这样的格式,如果不是当前页码,则输出超链接格式。
完整代码
完整代码如下:


<?php
<!-- lang: php -->
//数据库连接
<!-- lang: php -->
@mysql_connect("localhost","root","root123") or die("连接数据库失败:".mysql_error());
<!-- lang: php -->
mysql_select_db("test");
<!-- lang: php -->
mysql_query("set character set 'gbk'");
<!-- lang: php -->

<!-- lang: php -->
//每页显示的留言数
<!-- lang: php -->
$pagesize = 4;
<!-- lang: php -->

<!-- lang: php -->
//确定页数 p 参数
<!-- lang: php -->
$p = $_GET['p']?$_GET['p']:1;
<!-- lang: php -->

<!-- lang: php -->
//数据指针
<!-- lang: php -->
$offset = ($p-1)*$pagesize;
<!-- lang: php -->

<!-- lang: php -->
//查询本页显示的数据
<!-- lang: php -->
$query_sql = "SELECT * FROM guestbook ORDER BY id DESC LIMIT  $offset , $pagesize";
<!-- lang: php -->
//echo $query_sql;
<!-- lang: php -->
$result = mysql_query($query_sql);
<!-- lang: php -->
//循环输出
<!-- lang: php -->
while($gblist = mysql_fetch_array($result)){
<!-- lang: php -->
    echo '<a href="',$gblist['nickname'],'">',$gblist['nickname'],'</a>�';
<!-- lang: php -->
    echo '发表于:',date("Y-m-d H:i", $gblist[createtime]),'<br />';
<!-- lang: php -->
    echo '内容:',$gblist['content'],'<br /><hr />';
<!-- lang: php -->
}
<!-- lang: php -->

<!-- lang: php -->
//分页代码
<!-- lang: php -->
//计算留言总数
<!-- lang: php -->
$count_result = mysql_query("SELECT count(*) as count FROM guestbook");
<!-- lang: php -->
$count_array = mysql_fetch_array($count_result);
<!-- lang: php -->

<!-- lang: php -->
//计算总的页数
<!-- lang: php -->
$pagenum=ceil($count_array['count']/$pagesize);
<!-- lang: php -->
echo '共 ',$count_array['count'],' 条留言';
<!-- lang: php -->

<!-- lang: php -->
//循环输出各页数目及连接
<!-- lang: php -->
if ($pagenum > 1) {
<!-- lang: php -->
    for($i=1;$i<=$pagenum;$i++) {
<!-- lang: php -->
        if($i==$p) {
<!-- lang: php -->
            echo ' [',$i,']';
<!-- lang: php -->
        } else {
<!-- lang: php -->
            echo ' <a href="index.php?p=',$i,'">',$i,'</a>';
<!-- lang: php -->
        }
<!-- lang: php -->
    }
<!-- lang: php -->
}
<!-- lang: php -->
?>

运行显示效果:
Tom 发表于:2010-09-01 18:16
内容:Hello

小丽 发表于:2010-09-01 01:42
内容:hahaha

小张 发表于:2010-01-22 22:05
内容:来看看

小明 发表于:2010-01-22 22:01
内容:做得好,继续努力

共 10 条留言 1 [2] 3

你可能感兴趣的:(PHP 分页技术)