文章教程

13.3.4数据分页显示的原理及实现

9/17/2020 9:26:54 PM 人评论 次浏览

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所示的分页浏览数据效果。

图 13-10 分页显示数据的效果

教程类别