分享的一个分页类

  1. <?php
  2. /* C_page.php
  3. * $db = new mysql("localhost","root","roort","dbname","utf8"); //实例化数据库类
  4. * $sql = "SELECT * FROM article order by article_id desc"; //sql语句
  5. * $page = new page($sql,7,"index.php?"); //实例化分页类
  6. * $sql = $page->pagesql(); //格式化sql语句
  7. * $result = $db->query($sql);
  8. * while($row=$db->fetch_array($result)) {
  9. * echo $row["article_id"].$row["article_title"]."<br />";
  10. * }
  11. * echo $page->show(); //输出html
  12. * $db->close();
  13. * ====================================================
  14. */
  15. class multipage{
  16. private $url;
  17. private $pagesize; //每页要显示的记录数
  18. private $sql; //sql语句
  19. private $getpage; //当前页数
  20. //参数:sql语句,每页记录数,传递链接(例如"index.php?"或者"index.php?sort=1&"等)
  21. //输出的url为index.php?page=23或者index.php?type=1&page=2
  22. //意思为第23页或者第1类的第2页
  23. //开始初始化
  24. function __construct($sql,$pagesize,$url) {
  25. $this->url = $url;
  26. $this->pagesize = $pagesize;
  27. $this->sql = $sql;
  28. $this->getpage = intval( $_GET['page'] ); //page值由url传递,例如list.php?page=2
  29. if(!$this->getpage) { //检查是否传递了page值,如果没有则设置为1
  30. $this->getpage=1;
  31. }
  32. }
  33. //获取记录总条数
  34. function getcount() {
  35. return mysql_num_rows(mysql_query($this->sql));
  36. }
  37. //格式化sql语句
  38. function pagesql() {
  39. $nowpage = $this->getpage; //当前页号
  40. $limitNumber= $this->pagesize; //每页记录数
  41. if($nowpage<1) { //如果不是合法页号,则设置为第一页,如果超出了最后一页是不是应该同样操作????
  42. $nowpage=1;
  43. }
  44. return $this->sql." limit ".($nowpage-1)*$limitNumber.",".$limitNumber;
  45. //对sql语句处理,加上limit算法 select * from table limit offset,rows
  46. // 1-10,11-20,21-30
  47. //如每页显示10条,那么第3页就要显示第30-39间的10条,就是 select * from `table` limit 20,10
  48. }
  49. //显示分页,参数:显示数字链接个数,偏移量
  50. //$offset的作用是如果当前页号是4,那么分页条中就会显示从(4-2=2)开始的5页的链接
  51. //那么,要显示的练级的页号就是从2开始到6,即4-2=2到4+5-2-1=6
  52. //分页条的结构是 offset+1+(page-offset-1)=page
  53. function show($page = 5,$offset = 2){ //page是要显示的数字链接的个数,如果页数太多,不能全部显示,只显示一部分
  54. $mpurl = $this->url; //默认url,就是除去页号变量的部分
  55. $curr_page = $this->getpage; //当前页号
  56. $perpage = $this->pagesize; //每页记录数
  57. $num=$this->getcount(); //调用本类中的getcount函数,获得总记录数
  58. $multipage = ''; //初始化分页代码html内容
  59. //如果总记录数大于每页显示的记录数,也就是说一页以上
  60. if ($num> $perpage){
  61. $totalpage = ceil($num / $perpage); //pages总页数=总记录数/每页记录数
  62. $from = $curr_page - $offset; //分页条开始页号
  63. $to = $curr_page + $page - $offset - 1; //分页条结束页号
  64. //------------------------------------------------------------------------------------------------
  65. if ($page> $totalpage){ //如果初始的分页条显示的链接数大于 总页数
  66. $from = 1; //即 不足以填充满一个分页条的情况下
  67. $to = $totalpage; //最后一个链接就是总页数
  68. }else{
  69. //------------------------------------------------------------------------------------------------
  70. //下面讨论的是当一个分页条的链接数不能完整的显示出所有的页号时
  71. //如 上一页……3 4 5 6 7……下一页 当前为第5页,共有记录100条,20页
  72. //------------------------------------------------------------------------------------------------
  73. //第一种特殊情况 如 上一页 1 2 3 4 5……下一页 当前为第1页的情况下
  74. //这样计算出来的$from<1甚至小于0
  75. if ($from <1){ //当前页号是1的时候,如果继续按照上面的算法,$from页号会是-1,这要求在$from<1时,重新初始化$from=1
  76. $to = $curr_page + 1-$from; //计算结束页号
  77. //这里的$from=$curpage - $offset
  78. //$to为什么要等于$curpage + 1 - $from 呢?
  79. //这里的$to的值永远是$offset+1
  80. //为什么不直接给$to一个常量或什么呢?
  81. $from = 1; //重新设置开始页号,因为$from<1是不合法的
  82. if (($to - $from) <$page && ($to - $from) <$totalpage){ //如果分页条显示的链接数小于预设值和总页数
  83. $to = $page; //结束页号设置为$page
  84. }
  85. //------------------------------------------------------------------------------------------------
  86. //下面的情况是当前页为最后页的情况,处理同上
  87. }elseif ($to> $totalpage){ //
  88. $from = $curr_page - $totalpage + $to; //
  89. $to = $totalpage; //
  90. if (($to - $from) <$page && ($to - $from) <$totalpage){ //
  91. $from = $totalpage - $page + 1; //
  92. }
  93. }
  94. }
  95. //开始定义输出
  96. $multipage .= '<div class="pagebar">';
  97. $multipage .= '<span>'.$num.'</span>';
  98. $multipage .= '<span>'.$curr_page.'/'.$totalpage.'</span>';
  99. if ($curr_page - $offset> 1){
  100. $multipage .= '<li><a href="'.$mpurl.'page=1" title="首页">首页</a></li> ';
  101. $prev_page =$curr_page-1;
  102. $multipage .='<li><a href="'.$mpurl.'page='.$prev_page.'title="上一页">上一页</a></li> ';
  103. }
  104. for ($i = $from; $i <= $to; $i++){
  105. if ($i != $curr_page){
  106. $multipage .='<li><a href="'.$mpurl.'page='.$i.'" title="第'.$i.'页">'.$i.'</a></li> ';
  107. }else{
  108. $multipage .= '<li> <span class="pcurpage">'.$i.'</span></li>';//当前页不用带超链接
  109. }
  110. }
  111. if ($curr_page + $offset <$totalpage){
  112. $next_page =$curr_page-1;
  113. $multipage .='<li><a href="'.$mpurl.'page='.$next_page.'title="下一页">下一页</a></li> ';
  114. $multipage .= '<li><a href="'.$mpurl.'page='.$totalpage.'" title=“尾页”>尾页</a></li>';
  115. }
  116. $multipage .='</div>';
  117. }
  118. return $multipage;
  119. }
  120. }
  121. //输出结构为 首页 上一页 2 3 4 5 6 下一页 尾页
  122. ?>