分页显示一种非常常见的浏览和显示量数据的方法,属于web编程中最常处理的之一。对于web编程的老手来说,编写这种代码实在和呼吸一样自然,但对于初学者来说,常常对这个问题摸不着头绪,因此特地撰写此文对这个问题进行详细的讲解。
一、分页原理:
所谓分页显示,也就将数据库中的结果集人为的分成一段一段的来显示,这里需要两个初始的参数:
每页多少条记录($PageSize)? 当前第几页($CurrentPageID)?
现在只要再给一个结果集,就可以显示某段特定的结果出来。
至于其他的参数,比如:上一页($PReviousPageID)、下一页($NextPageID)、总页数($numPages)等等,都可以根据前边这几个东西得到。
以MySQL数据库为例,如果要从表内截取某段内容,sql语句可以用:
select*fromtablelimitoffset,rows。看看一组sql语句,尝试一下发现其中的规率。 前10条记录:select*fromtablelimit0,10
第11至20条记录:select*fromtablelimit10,10 第21至30条记录:select*fromtablelimit20,10 ……
这一组sql语句其实就当$PageSize=10的时候取表内每一页数据的sql语句,们可以总结出这样一个模板:
select*fromtablelimit($CurrentPageID-1)*$PageSize,$PageSize
拿这个模板代入对应的值和上边那一组sql语句对照一下看看不那么回事。搞定了最重要的如何获取数据的问题以后,剩下的就仅仅传递参数,构造合适的sql语句然后使用php从数据库内获取数据并显示了。 二、分页代码说明:五个步骤
代码中有充分解释,可复制到自己记事本中直接使用 1. 2.
3. 4.
雇员信息列表 5. 6. 7. //显示所有emp表的信息 8. //1.连接数据库
9. $conn=mysql_connect('localhost','root','1234abcd')ordie('连接数据库
'.mysql_error()); 10. //2.选择数据库
11. mysql_select_db('empManage'); 12. //3.选择字符集
1
13. mysql_query('setnamesutf8'); 14. //4.sql语句并得到结果进行处理
15. //4.1分页[分页要发出两个sql语句,一个获得$rowCount,一个通过sql的
limit获得分页结果。所以们会获得两个结果集,在命名的时候要记得区分。 16. 分页(四个值两个sql语句)。] 17. $pageSize=3;//每页显示多少条记录 18. $rowCount=0;//共有多少条记录 19. $pageNow=1;//希望显示第几页
20. $pageCount=0;//一共有多少页[分页共有这个四个指标,缺一不可。由于
$rowCount可以从器获得的,所以可以给予初始值为0;
21. $pageNow希望显示第几页,这里设置为0;$pageSize每页显示多少条记录,
这里根据需求提前制定。
22. $pageCount=ceil($rowCount/$pageSize),既然$rowCount可以初始值为0,
那么$pageCount当然也就可以设置为0.四个指标,两个0,一个1,另一个为需求。]
23. //4.15根据分页来$pageNow的值 24. if(!empty($_GET['pageNow'])){ 25. $pageNow=$_GET['pageNow']; 26. }[根据分页来$pageNow的值。] 27. $sql='selectcount(id)fromemp'; 28. $res1=mysql_query($sql); 29. //4.11取出行数
30. if($row=mysql_fetch_row($res1)){ 31. $rowCount=$row[0];
32. }//[取得$rowCount,,进了们就知道了$pageCount这两个指标了。] 33. //4.12计算共有多少页
34. $pageCount=ceil($rowCount/$pageSize); 35. $pageStart=($pageNow-1)*$pageSize; 36. //4.13带有分页的sql结果
37. $sql=\"select*fromemplimit$pageStart,$pageSize\";//[根据$sql语句的limit后
面的两个值(起始值,每页条数),来实现分页。以及求得这两个值。] 38. $res2=mysql_query($sql,$conn)ordie('无法获取结果集'.mysql_error());
39. echo'';[echo\"='red'width='600px'>\";]40. \"
| id | name | grade | email | salary th> | 删除用户 | 用户 |
\";while($row=mysql_fetch_assoc($res2)){2
41. echo\"
| {$row['id']} | {$row['name']} | {$row['grade']}< /td> | {$row['email']} | {$row['salary']} | 删除用户 | 用户 |
\";} 42. echo'';43. //4.14打印出页码的超
44. for($i=1;$i<=$pageCount;$i++){
45. echo\"$i\";//[打印出页码的超] 46. }47. //5.释放资源,关闭连接 48. mysql_free_result($res2); 49. mysql_close($conn); 50. ?>
51. 三、简单分页类
现在公布一个简单分类。只要理解了这个类的原理和步骤,其他复杂类也就能够触类旁通了。不废话,直接上源码,可以直接用在你的中。 数据库操作类代码:mysqli.func.php 1. 2. //数据库连接常量
3. define('DB_HOST','localhost'); 4. define('DB_USER','root'); 5. define('DB_PWD','');
6. define('DB_NAME','guest'); 7. //连接数据库 8. functionconn() 9. {
10. $conn=mysqli_connect(DB_HOST,DB_USER,DB_PWD,DB_NAME); 11. mysqli_query($conn,\"setnamesutf8\"); 12. return$conn; 13. }
14. //获得结果集
15. functiondoresult($sql){
16. $result=mysqli_query(conn(),$sql); 17. return$result; 18. }
19. //结果集转为对象集合 20. functiondolists($result){
21. returnmysqli_fetch_array($result,MYSQL_ASSOC); 22. }
23. functiontotalnums($sql){
3
24. $result=mysqli_query(conn(),$sql); 25. return$result->num_rows; 26. }
27. //关闭数据库 28. functionclosedb() 29. {
30. if(!mysqli_close()){ 31. exit('关闭异常'); 32. } 33. } 34. ?>
分页实现代码: 1. 2. include'mysqli.func.php'; 3. //总记录数
4. $sql=\"SELECTdg_idFROMtb_user\"; 5. $totalnums=totalnums($sql); 6. //每页显示条数 7. $fnum=8; 8. //翻页数
9. $pagenum=ceil($totalnums/$fnum); 10. //页数常量
11. @$tmp=$_GET['page']; 12. //防止恶意翻页 13. if($tmp>$pagenum)
14. echo\"\"; 15. //计算分页起始值 16. if($tmp==\"\"){ 17. $num=0; 18. }else{
19. $num=($tmp-1)*$fnum; 20. }
21. //查询语句
22. $sql=\"SELECTdg_id,dg_usernameFROMtb_userORDERBYdg_idDESCLIMIT\".$nu
m.\
23. $result=doresult($sql); 24. //遍历输出
25. while(!!$rows=dolists($result)){
26. echo$rows['dg_id'].\"\".$rows['dg_username'].\"
\"; 27. }
4
28. 29. 30. 31. 32. //翻页
for($i=0;$i<$pagenum;$i++){
echo\"\".($i+1).\"\"; } ?>5