一个功能比较高的分页类(for PHP5.x)

怕水平的不高,所以从来没有放过任何代码,这个类我已经用了很久,近来用面向对象方法重写,适用于PHP5.x,特地扔出,不怕见笑,希望抛砖引玉。

这个类适用于配合数据库查询分页,和数组分页,下面有使用方法。

  1. /*
  2. * 名称: 分页类
  3. * 介绍: 适用于数组分页和配合sql查询的分页
  4. * 作者: idlion || Moonfly
  5. * 创建时间: 20060218
  6. * 最后修改: 20070524
  7. */
  8. class PageBreak {
  9. private $mTotalRowsNum = 0; // 总信息行数
  10. private $mCurPageNumber = 1; // 当前所在页
  11. private $mTotalPagesNum = 1; // 总页数
  12. private $mQueryString; // 页面传递的数据(url?后的字符串)
  13. private $mPageRowsNum = 20; // 每页显示行数
  14. private $mIndexBarLength = 5; // 索引条的页数
  15. private $mIndexBar = ''; // 页码索引条
  16. private $mPageInfo = ''; // 分页信息
  17. // 页码索引条样式
  18. private $mNextButton = "8";
  19. private $mPreButton = "7";
  20. private $mFirstButton = "9";
  21. private $mLastButton = ":";
  22. private $mCssIndexBarCurPage = "fontweight:bold;color:#FF0000";
  23. private $mCssIndexBarPage = '';
  24. // 分页信息样式
  25. private $mCssPageInfoNumFont = 'color:#FF0000';
  26. private $mCssPageInfoFont = '';
  27. // 构造方法
  28. public function __construct(&$rSqlQuery, $userPageRowsNum='') {
  29. if( !is_array($rSqlQuery) ) {
  30. $this>SetDbPageBreak($rSqlQuery, $userPageRowsNum);
  31. }
  32. else {
  33. $this>SetArrayPageBreak($rSqlQuery, $userPageRowsNum);
  34. }
  35. }
  36. // 设置数据库型分页
  37. private function SetDbPageBreak(&$rSqlQuery, $userPageRowsNum='') {
  38. $this>SetDbTotalRowsNum($rSqlQuery);
  39. $this>SetTotalPagesNum($userPageRowsNum);
  40. if( $this>mTotalPagesNum > 1 ) {
  41. $this>SetCurPageNumber();
  42. $this>SetSqlQuery($rSqlQuery);
  43. $this>SetQueryString();
  44. $this>SetIndexBar();
  45. $this>SetPageInfo();
  46. }
  47. }
  48. // 设置数组型分页
  49. private function SetArrayPageBreak(&$rArray, $userPageRowsNum='', $userTotalRowsNum='') {
  50. $this>SetArrayTotalRowsNum($rArray, $userTotalRowsNum);
  51. $this>SetTotalPagesNum($userPageRowsNum);
  52. if( $this>mTotalPagesNum > 1 ) {
  53. $this>SetCurPageNumber();
  54. $this>SetArray($rArray);
  55. $this>SetQueryString();
  56. $this>SetIndexBar();
  57. $this>SetPageInfo();
  58. }
  59. }
  60. // 数据库型计算总行数
  61. private function SetDbTotalRowsNum($rSqlQuery) {
  62. $this>mTotalRowsNum = mysql_num_rows( mysql_query($rSqlQuery) );
  63. }
  64. // 数组型计算总行数
  65. private function SetArrayTotalRowsNum($array) {
  66. $this>mTotalRowsNum = count($array);
  67. }
  68. // 计算总页数
  69. private function SetTotalPagesNum($userPageRowsNum='') {
  70. if( $userPageRowsNum ) {
  71. $this>mPageRowsNum = $userPageRowsNum;
  72. }
  73. $this>mTotalPagesNum = (int)( floor( ($this>mTotalRowsNum1)/$this>mPageRowsNum )+1 );
  74. }
  75. // 计算当前页数
  76. private function SetCurPageNumber() {
  77. if( $_GET['cur_page'] ) {
  78. $this>mCurPageNumber = $_GET['cur_page'];
  79. }
  80. }
  81. // 修正Sql截取语句
  82. private function SetSqlQuery(&$rSqlQuery) {
  83. $start_number = ($this>mCurPageNumber1)*$this>mPageRowsNum;
  84. $rSqlQuery .= " LIMIT ".$start_number.",".$this>mPageRowsNum;
  85. }
  86. // 修正截取后的Array
  87. private function SetArray(&$rArray) {
  88. $start_number = ($this>mCurPageNumber1)*$this>mPageRowsNum;
  89. $rArray = array_slice($rArray, $start_number, $this>mPageRowsNum);
  90. }
  91. // 修正 $_GET 传递数据
  92. private function SetQueryString() {
  93. $query_string = $_SERVER['QUERY_STRING'];
  94. if ( $query_string == '' ) {
  95. $this>mQueryString = "?cur_page=";
  96. }
  97. else {
  98. $this>mQueryString = preg_replace("/&?cur_page=d+/", '', $query_string);
  99. $this>mQueryString = "?".$this>mQueryString."&cur_page=";
  100. }
  101. }
  102. // 设置页码索引条
  103. private function GetPageIndex() {
  104. if( $this>mTotalPagesNum <= $this>mIndexBarLength ) {
  105. $first_number = 1;
  106. $last_number = $this>mTotalPagesNum;
  107. }
  108. else {
  109. $offset = (int)floor($this>mIndexBarLength/2);
  110. if( ($this>mCurPageNumber$offset) <= 1 ) {
  111. $first_number = 1;
  112. }
  113. elseif( ($this>mCurPageNumber+$offset) > $this>mTotalPagesNum ) {
  114. $first_number = $this>mTotalPagesNum$this>mIndexBarLength+1;
  115. }
  116. else {
  117. $first_number = $this>mCurPageNumber$offset;
  118. }
  119. $last_number = $first_number+$this>mIndexBarLength1;
  120. }
  121. $last_number;
  122. for( $i=$first_number; $i<=$last_number; $i++ ) {
  123. if( $this>mCurPageNumber == $i ) {
  124. $page_index .= "".$i." ";
  125. }
  126. else {
  127. $page_index .= "".$i." ";
  128. }
  129. }
  130. return $page_index;
  131. }
  132. // 设置页码索引条
  133. private function SetIndexBar() {
  134. $this>mIndexBar = $this>GetNavFirstButton();
  135. $this>mIndexBar .= $this>GetNavPreButton();
  136. $this>mIndexBar .= $this>GetPageIndex();
  137. $this>mIndexBar .= $this>GetNavNextButton();
  138. $this>mIndexBar .= $this>GetNavLastButton();
  139. }
  140. // 得到页码索引条 首页按钮
  141. private function GetNavFirstButton() {
  142. return "".$this>mFirstButton." ";
  143. }
  144. // 得到页码索引条 上一页按钮
  145. private function GetNavPreButton() {
  146. if( $this>mCurPageNumber>1 ) {
  147. $pre_number = $this>mCurPageNumber1;
  148. }
  149. else {
  150. $pre_number = 1;
  151. }
  152. return "".$this>mPreButton." ";
  153. }
  154. // 得到页码索引条 下一页按钮
  155. private function GetNavNextButton() {
  156. if( $this>mCurPageNumbermTotalPagesNum ) {
  157. $next_number = $this>mCurPageNumber+1;
  158. }
  159. else {
  160. $next_number = $this>mTotalPagesNum;
  161. }
  162. return "".$this>mNextButton." ";
  163. }
  164. // 得到页码索引条 末页按钮
  165. private function GetNavLastButton() {
  166. return "".$this>mLastButton." ";
  167. }
  168. // 设置分页信息
  169. private function SetPageInfo() {
  170. $this>mPageInfo ="";
  171. $this>mPageInfo .= "共 ".$this>mTotalRowsNum." 条信息 | ";
  172. $this>mPageInfo .= "".$this>mPageRowsNum." 条/页 | ";
  173. $this>mPageInfo .= "共 ".$this>mTotalPagesNum." 页 | ";
  174. $this>mPageInfo .= "第 ".$this>mCurPageNumber." 页";
  175. $this>mPageInfo .= "";
  176. }
  177. // 取出页码索引条
  178. public function GetIndexBar() {
  179. return $this>mIndexBar;
  180. }
  181. // 取出分页信息
  182. public function GetPageInfo() {
  183. return $this>mPageInfo;
  184. }
  185. }
  186. ?>

代码用法1: 配合数据库使用(例子中配合的是我自己的数据库操作类和模版类)

  1. // 这是一个sql查询语句,我们来对它的查询结果作出分页
  2. $sql = "select * from member";
  3. // 读取分页类
  4. require_once("pagebreak.php");
  5. // 分页初始化
  6. // $sql就是上面的查询语句
  7. // 20是每页显示的数量
  8. // 通过分页类的初始化,这个查询语句就被加上" limit ...... "
  9. $pagebreak = new PageBreak($sql, 20);
  10. // 生成分页索引导航条
  11. $navbar = $pagebreak>GetPageInfo().$pagebreak>GetIndexBar();
  12. // 查询的结果(这里用我自己的类,不多说了)
  13. $result = $db>GetFieldsArray($sql)
  14. // 输出查询结果
  15. var_dump($result);
  16. // 输出分页索引导航条
  17. echo $navbar;

代码用法2: 配合要输出的数组

  1. // 这是一个sql查询语句,并得到查询结果
  2. $sql = "select * from member";
  3. $result = $db>GetFieldsArray($sql);
  4. // 读取分页类
  5. require_once("pagebreak.php");
  6. // 分页初始化
  7. // $result就是上面的查询后得到的结果
  8. // 20是每页显示的数量
  9. // 通过分页类的初始化,这个结果数组被自动截取成相应页的信息内容
  10. $pagebreak = new PageBreak($result, 20);
  11. // 生成分页索引导航条
  12. $navbar = $pagebreak>GetPageInfo().$pagebreak>GetIndexBar();
  13. // 输出查询结果
  14. var_dump($result);
  15. // 输出分页索引导航条
  16. echo $navbar;

下面是输出样式:

前半部分信息条,是$pagebreak>GetPageInfo()

后半部分分页索引导航,是$pagebreak>GetIndexBar()

输出内容和样式可以很方便的在类中调整,很简单,有兴趣可以研究一下