php分页可利用表格来分页类

  1. <?php
  2. /*
  3. * 直接输出数据表和分页信息
  4. * 在新建对象时需要的变量:$query(从数据表中获取记录数的sql语句),$page(当前页码),$maxline(每页几行))
  5. * 1、showpage方法:如果上面创建对象的$query正确,直接调用,即可输出分页信息
  6. * 2、showtable方法:需要的变量:$query(从数据库读取记录的SQL语句,不要加Limit,因为在方法中已经添加)
  7. * 直接输出<tr><td></td></tr>的表格,所以只需在前后加上<table></table>就是完整的表格
  8. * 3、showresult方法:根据提交的$query中的SQL,直接将$result资源返回,表格可以自己定义
  9. * 示例:
  10. //获取当前页,并定义每页最大行
  11. $page=1;
  12. $maxline="10";
  13. if(!empty($_GET["page"])){
  14. $page=$_GET["page"];
  15. }
  16. //定义计算表内数据总数的SQL语句,这里必须和下面的$query是同一个表和条件,创建对象,输出页码和表格
  17. $query="select count(*) from mailbox";
  18. $a=new PageList($query, $maxline, $page);
  19. $a->showpage();
  20. //这里显示列表,需要和上面的SQL语句一样的条件
  21. $query="select username,name,quota,created,modified,active from mailbox order by created desc";
  22. echo "<table width='800' cellspacing='0' cellpadding='0' class='pagelist'>";
  23. $a->showtable($query);
  24. echo "</table>";
  25. * */
  26. class PageList{
  27. private $link;
  28. private $result;
  29. private $maxline;
  30. private $page=1;
  31. private $startline=0;
  32. private $countline;
  33. public $countpage;
  34. private $prevpage;
  35. private $nextpage;
  36. //数据库联接,需要修改为您自己的地址
  37. private $dbhost=DBHOST;
  38. private $dbuser=DBUSER;
  39. private $dbpasswd=DBPASSWD;
  40. private $dbtable=DBTABLE;
  41. /*
  42. * 构造函数中建立数据库联接
  43. * 1、数据库连接的4个参数设置为常量 记录在config.php页面中
  44. * 2、连接数据库,并选择数据库
  45. * 3、设置数据库执行的编码方式为utf8
  46. * 4、将接收到的$maxline,$page两个变量赋值给类属性,成为该类通用属性
  47. * (其中$query是count(*)的SQL,和下面方法中的query是不一样的)
  48. * 5、根据新建对象时递交的$query语句,对数据库执行查询,将得到的总记录数赋值到类属性中$this->countline
  49. * 将总记录数/每页行数,再用ceil函数高位取整,得到总页数并赋值到类属性中$this->countpage
  50. * 6、根据递交的当前页码$page,算出前后页的数字$this->prevpage和$this->nextpage
  51. * 还有必须算出数据库读取的起始行$this->startline
  52. * 这里分3种情况,page<2 ,page=最后一页,page>1(这个情况可以不判断,直接用else)
  53. * */
  54. public function __construct($query,$maxline,$page){
  55. @$this->link=mysql_connect($dbhost,$dbuser,$dbpasswd) or die($this->feedback='System Error ,Please contect admin');
  56. @mysql_select_db($dbtable,$this->link) or die($this->feedback='System Error ,Please contect admin');
  57. @mysql_query('set names utf8');
  58. $this->maxline=$maxline;
  59. //读取行数,并将结果返回$coutline
  60. $this->result=mysql_query($query) or die($this->feedback='System Error ,Please contect admin');
  61. if($count=mysql_fetch_row($this->result)){
  62. //intval将字符串转为int,可以不转,但这样的程序更健康
  63. $this->countline = intval($count[0]);
  64. $this->countpage = ceil($this->countline/$maxline);
  65. }
  66. //判断递交的$page是否大于总页数
  67. if($page<=$this->countpage){
  68. $this->page=$page;
  69. }
  70. if($this->page<2){
  71. $this->prevpage=0;
  72. $this->nextpage=2;
  73. $this->startline= 0;
  74. }elseif($this->page==$this->countpage){
  75. $this->prevpage=$this->page-1;
  76. $this->nextpage=0;
  77. $this->startline= ($this->page-1)*$this->maxline;
  78. }else{
  79. $this->prevpage=$this->page-1;
  80. $this->nextpage=$this->page+1;
  81. $this->startline= ($this->page-1)*$this->maxline;
  82. }
  83. }
  84. /*
  85. * 析构函数
  86. * 释放资源,关闭数据库连接
  87. * */
  88. public function __destruct(){
  89. mysql_free_result($this->result);
  90. mysql_close($this->link);
  91. exit();
  92. }
  93. /*
  94. * 输出分页信息
  95. * */
  96. public function showpage(){
  97. //$listnum显示上下页中间的数字位数,一定要偶数阿!否则不能被2除
  98. $listnum=10;
  99. echo $this->countline." Items, ".$this->countpage." Pages ";
  100. if($this->prevpage==0){
  101. echo "&lt;&lt;Prev ";
  102. }else{
  103. echo "<a href=?page=".$this->prevpage.">&lt;&lt;Prev</a> ";
  104. }
  105. if($this->countpage<$listnum){ //判断总页数是否小于$listnum
  106. $page_start=1;
  107. $page_end=$this->countpage;
  108. }elseif($this->page<$listnum/2){ //判断当前页是否小于$listnum的一半
  109. $page_start=1;
  110. $page_end=$listnum;
  111. }elseif($this->page>$this->countpage-($listnum/2)){ //判断当前页是否是最后几页了
  112. $page_start=$this->countpage-($listnum-1);
  113. $page_end=$this->countpage;
  114. }else{ //如果上面的条件都不符合,那当前也正在中间
  115. $page_start=$this->page-($listnum/2-1);
  116. $page_end=$this->page+($listnum/2);
  117. }
  118. for($i=$page_start;$i<=$page_end;$i++){ //根据上面判断的start和end页码,循环输出之间的页码
  119. if($i==$this->page){
  120. echo "<b>".$i."</b> ";
  121. }else{
  122. echo "<a href=?page=".$i.">".$i."</a> ";
  123. }
  124. }
  125. if ($this->nextpage==0){
  126. echo " Next&gt;&gt;";
  127. }else{
  128. echo " <a href=?page=".$this->nextpage.">Next&gt;&gt;</a> ";
  129. }
  130. }
  131. /*
  132. * 根据sql语句读取数据库中的数据,然后列成表单输出
  133. * 需要的变量:$field(字段),$table(表名),$startline(开始行),$maxline(每页显示行数)
  134. * 输出从表格的tr开始,从tr结束,所以在使用这个方法前后要加table的标签
  135. * */
  136. public function showtable($query){
  137. $query=$query." LIMIT ".$this->startline.",".$this->maxline;
  138. $result = mysql_query($query) or die($this->feedback='System Error ,Please contect admin');
  139. //行循环开始,定义一个$i变量,用来显示行号,每次执行一条while语句,指针就指向下一条数据
  140. $i=0;
  141. while ($fetch = mysql_fetch_assoc($result)){
  142. $i++;
  143. echo "<tr><td>".$i."</td>";
  144. //列循环开始,因为通过while后,$fetch已经是个数组,所以通过foreach遍历数组即可
  145. foreach ($fetch as $value){
  146. echo "<td>".$value."</td>";
  147. }
  148. echo "</tr>";
  149. }
  150. }
  151. /*
  152. * 这个方法是将资源传出,表格在外面自定义样式
  153. * */
  154. public function showresult($query){
  155. $result = mysql_query($query) or die($this->feedback='System Error ,Please contect admin');
  156. return $result;
  157. }
  158. }
  159. ?>