13.3.4 数据分页显示的原理及实现
分页显示是Web编程中最频繁处理的环节之一。所谓分页显示,就是通过程序将结果集一段一段地来显示。实现分页显示,需要两个初始参数:每页显示多少记录和当前是第几页。再加上完整的结果集,就可以实现数据的分段显示。至于其他功能,比如上一页、下一页等均可以根据以上信息加以处理得到。
在12.3.9小节,讲述了使用LIMIT子句对查询结果做限定。比如要取得某表中的前10条记录,可以使用如下SQL语句。
SELECT*FROM a_table LIMIT 0,10;
如要查找第11条到第20条记录,使用的SQL语句如下所示。
SELECT*FROM a_table LIMIT 10,10;
如要查找第21条到第30条记录,使用的SQL语句如下所示。
SELECT*FROM a_table LIMIT 20,10;
从以上SQL语句可以看出,每次取10条记录,相当于每个页面显示10条数据,而每次所要取得记录的起始位置和当前页数之间存在着这样的关系:起始位置=(当前页数-1)×每页要显示的记录数。如果以变量$page_size表示每页显示的记录数,以变量$cur_page表示当前页数,那么上述可以用下面所示的SQL语句模板归纳。
select*from table limit($cur_page-1)*$page_size,$page_size;
这样,就得到了分页情况下获取数据的SQL语句。其中$page_size可以根据实际情况指定为一个定值,实际开发中,当前页数$cur_page可以由参数传入。另外,数据要显示的总页数,可以在记录总数和每页显示的记录数之间通过计算获得。比如,如果总记录数除以每页显示的记录数后,没有余数,那么总页数就是这二者之商。代码13-8是在代码13-7的基础上添加分页功能的程序,如下所示。
代码13-8 分页显示数据13-8.php
01 <?php
02 $host='localhost';//定义服务器
03 $user_name='root';//定义用户名
04 $password='admin';//定义密码
05
06 $conn=mysql_connect($host,$user_name,$password);//连接MySQL
07 if(!$conn)
08 {
09 die('数据库连接失败:'.mysql_error());
10 }
11 mysql_select_db('test');//选择数据库
12
13 if(isset($_GET['page']))//由GET方法获得当前页数
14 {
15 $page=$_GET['page'];
16 }
17 else
18 {
19 $page=1;
20 }
21 $page_size=2;//每页显示两条数据
22
23 //获取数据总量
24 $sql='select*from users';
25 $result=mysql_query($sql);
26 $total=mysql_num_rows($result);
27
28 //开始计算总页数
29 if($total)
30 {
31 //如果总数据量小于$page_size,那么只有一页
32 if($total<$page_size)
33 $page_count=1;
34 //如果有余数,则总页数等于总记录数除以页数的结果取整再加1
35 if($total%$page_size)
36 {
37 $page_count=(int)($total/$page_size)+1;
38 }
39 //如果没有余数,则页数等于总数据量除以每页数的结果
40 else
41 {
42 $page_count=$total/$page_size;
43 }
44 }
45 else
46 {
47 $page_count=0;
48 }
49 //翻页链接
50 $turn_page='';
51 if($page==1)
52 {
53 $turn_page.='首页|上一页|';
54 }
55 else
56 {
57 $turn_page.='<a href=13-8.php?page=1>首页</a>|<a href=13-8.php?page='.($page-1).'>上一页
58 </a>|';
59 }
60 if($page==$page_count||$page_count==0)
61 {
62 $turn_page.='下一页|尾页';
63 }
64 else
65 {
66 $turn_page.='<a href=13-8.php?page='.($page+1).'>下一页</a>|<a
67 href=13-8.php?page='.$page_count.'>尾页</a>';
68 }
69
70 $sql='select id,name,city,created_time from users limit'.($page-1)*$page_size.','.$page_size;
71 $result=mysql_query($sql)OR die("<br/>ERROR:<b>".mysql_error()."</b><br/>产生问题的SQL:".$sql);
72 ?>
73 <html>
74 <head>
75 <title>13-8.php</title>
76 </head>
77 <center>
78
79 <body>
80 <table width="75%"border="0"cellpadding="0"cellspacing="1"bgcolor="#7B7B84">
81 <tr bgcolor="#8BBCC7">
82 <td height="33"><div align="center"><strong>用户ID</strong></div></td>
83 <td><div align="center"><strong>用户名称</strong></div></td>
84 <td><div align="center"><strong>来自城市</strong></div></td>
85 <td><div align="center"><strong>注册时间</strong></div></td>
86 </tr>
87
88 <?php
89 if($num=mysql_num_rows($result))
90 {
91 while($row=mysql_fetch_array($result,MYSQL_ASSOC))
92 {
93 ?>
94 <tr bgcolor="#FFFFFF">
95 <td height="22"align="right"><?php echo$row['id'];?> </td>
96 <td height="22"> <?php echo$row['name'];?> </td>
97 <td height="22"> <?php echo$row['city'];?> </td>
98 <td height="22"> <?php echo$row['created_time'];?> </td>
99 </tr>
100 <?php
101 }
102 }
103 echo$turn_page;//将分页字符串输出
104 mysql_close($conn);
105 ?>
106
107 </table>
108 </body>
109 </center>
110 </html>
【代码解析】因为users表中的记录数不是很多,为达到分页显示的效果,代码13-8中设定每页显示的记录数为2。执行代码13-8,可以看到如图13-10所示的分页浏览数据效果。