+ -
当前位置:首页 → 问答吧 → 扔出一个功用比比较高的 分页类(for PHP5.x)

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

时间:2007-05-28

来源:互联网

怕水平的不高,所以从来没有放过任何代码,这个类我已经用了很久,近来用面向对象方法重写,适用于PHP5.x,特地扔出,不怕见笑,希望抛砖引玉。
这个类适用于配合数据库查询分页,和数组分页。下面有使用方法。
复制PHP内容到剪贴板
PHP代码:

<?php
/*
* 名称: 分页类
* 介绍: 适用于数组分页和配合sql查询的分页
* 作者: idlion || Moonfly ([[email protected]][email protected][/email])
* 创建时间: 2006-02-18
* 最后修改: 2007-05-24
*/
class PageBreak {
 private $mTotalRowsNum = 0;   // 总信息行数
 private $mCurPageNumber = 1;  // 当前所在页
 private $mTotalPagesNum = 1;  // 总页数
 private $mQueryString;     // 页面传递的数据(url?后的字符串)
 private $mPageRowsNum = 20;  // 每页显示行数
 private $mIndexBarLength = 5;  // 索引条的页数
 private $mIndexBar = '';     // 页码索引条
 private $mPageInfo = '';     // 分页信息
 // 页码索引条样式
 private $mNextButton = "<font style=\"font-family:webdings\">8</font>";
 private $mPreButton = "<font style=\"font-family:webdings\">7</font>";
 private $mFirstButton = "<font style=\"font-family:webdings\">9</font>";
 private $mLastButton = "<font style=\"font-family:webdings\">:</font>";
 private $mCssIndexBarCurPage = "font-weight:bold;color:#FF0000";
 private $mCssIndexBarPage = '';
 // 分页信息样式
 private $mCssPageInfoNumFont = 'color:#FF0000';
 private $mCssPageInfoFont = '';

 // 构造方法
 public function __construct(&$rSqlQuery, $userPageRowsNum='') {
  if( !is_array($rSqlQuery) ) {
   $this->SetDbPageBreak($rSqlQuery, $userPageRowsNum);
  }
  else {
   $this->SetArrayPageBreak($rSqlQuery, $userPageRowsNum);
  }
 }

 // 设置数据库型分页
 private function SetDbPageBreak(&$rSqlQuery, $userPageRowsNum='') {
  $this->SetDbTotalRowsNum($rSqlQuery);
  $this->SetTotalPagesNum($userPageRowsNum);
  if( $this->mTotalPagesNum > 1 ) {
   $this->SetCurPageNumber();
   $this->SetSqlQuery($rSqlQuery);
   $this->SetQueryString();
   $this->SetIndexBar();
   $this->SetPageInfo();
  }
 }

 // 设置数组型分页
 private function SetArrayPageBreak(&$rArray, $userPageRowsNum='', $userTotalRowsNum='') {
  $this->SetArrayTotalRowsNum($rArray, $userTotalRowsNum);
  $this->SetTotalPagesNum($userPageRowsNum);
  if( $this->mTotalPagesNum > 1 ) {
   $this->SetCurPageNumber();
   $this->SetArray($rArray);
   $this->SetQueryString();
   $this->SetIndexBar();
   $this->SetPageInfo();
  }
 }

 // 数据库型计算总行数
 private function SetDbTotalRowsNum($rSqlQuery) {
  $this->mTotalRowsNum = mysql_num_rows( mysql_query($rSqlQuery) );
 }

 // 数组型计算总行数
 private function SetArrayTotalRowsNum($array) {
  $this->mTotalRowsNum = count($array);
 }

 // 计算总页数
 private function SetTotalPagesNum($userPageRowsNum='') {
  if( $userPageRowsNum ) {
   $this->mPageRowsNum = $userPageRowsNum;
  }
  $this->mTotalPagesNum = (int)( floor( ($this->mTotalRowsNum-1)/$this->mPageRowsNum )+1 );
 }

 // 计算当前页数
 private function SetCurPageNumber() {
  if( $_GET['cur_page'] ) {
   $this->mCurPageNumber = $_GET['cur_page'];
  }
 }

 // 修正Sql截取语句
 private function SetSqlQuery(&$rSqlQuery) {
  $start_number = ($this->mCurPageNumber-1)*$this->mPageRowsNum;
  $rSqlQuery .= " LIMIT ".$start_number.",".$this->mPageRowsNum;
 }

 // 修正截取后的Array
 private function SetArray(&$rArray) {
  $start_number = ($this->mCurPageNumber-1)*$this->mPageRowsNum;
  $rArray = array_slice($rArray, $start_number, $this->mPageRowsNum);
 }

 // 修正 $_GET 传递数据
 private function SetQueryString() {
  $query_string = $_SERVER['QUERY_STRING'];
  if ( $query_string == '' ) {
   $this->mQueryString = "?cur_page=";
  }
  else {
   $this->mQueryString = preg_replace("/&?cur_page=\d+/", '', $query_string);
   $this->mQueryString = "?".$this->mQueryString."&cur_page=";
  }
 }

 // 设置页码索引条
 private function GetPageIndex() {
  if( $this->mTotalPagesNum <= $this->mIndexBarLength ) {
   $first_number = 1;
   $last_number = $this->mTotalPagesNum;
  }
  else {
   $offset = (int)floor($this->mIndexBarLength/2);
   if( ($this->mCurPageNumber-$offset) <= 1 ) {
    $first_number = 1;
   }
   elseif( ($this->mCurPageNumber+$offset) > $this->mTotalPagesNum ) {
    $first_number = $this->mTotalPagesNum-$this->mIndexBarLength+1;
   }
   else {
    $first_number = $this->mCurPageNumber-$offset;
   }
   $last_number = $first_number+$this->mIndexBarLength-1;
  }
  $last_number;
  for( $i=$first_number; $i<=$last_number; $i++ ) {
   if( $this->mCurPageNumber == $i ) {
    $page_index .= "<font style='".$this->mCssIndexBarCurPage."'>".$i."</font> ";
   }
   else {
    $page_index .= "<a href='".$this->mQueryString.$i."' style='".$this->mCssIndexBarPage."'>".$i."</a> ";
   }
  }
  return $page_index;
 }

 // 设置页码索引条
 private function SetIndexBar() {
  $this->mIndexBar = $this->GetNavFirstButton();
  $this->mIndexBar .= $this->GetNavPreButton();
  $this->mIndexBar .= $this->GetPageIndex();
  $this->mIndexBar .= $this->GetNavNextButton();
  $this->mIndexBar .= $this->GetNavLastButton();
 }

 // 得到页码索引条 首页按钮
 private function GetNavFirstButton() {
  return "<a href='".$this->mQueryString."1'>".$this->mFirstButton."</a> ";
 }

 // 得到页码索引条 上一页按钮
 private function GetNavPreButton() {
  if( $this->mCurPageNumber>1 ) {
   $pre_number = $this->mCurPageNumber-1;
  }
  else {
   $pre_number = 1;
  }
  return "<a href='".$this->mQueryString.$pre_number."'>".$this->mPreButton."</a> ";
 }

 // 得到页码索引条 下一页按钮
 private function GetNavNextButton() {
  if( $this->mCurPageNumber<$this->mTotalPagesNum ) {
   $next_number = $this->mCurPageNumber+1;
  }
  else {
   $next_number = $this->mTotalPagesNum;
  }
  return "<a href='".$this->mQueryString.$next_number."'>".$this->mNextButton."</a> ";
 }

 // 得到页码索引条 末页按钮
 private function GetNavLastButton() {
  return "<a href='".$this->mQueryString.$this->mTotalPagesNum."'>".$this->mLastButton."</a> ";
 }

 // 设置分页信息
 private function SetPageInfo() {
  $this->mPageInfo ="<font style='".$this->mCssPageInfoFont."'>";
  $this->mPageInfo .= "共 <font style='".$this->mCssPageInfoNumFont."'>".$this->mTotalRowsNum."</font> 条信息 | ";
  $this->mPageInfo .= "<font style='".$this->mCssPageInfoNumFont."'>".$this->mPageRowsNum."</font> 条/页 | ";
  $this->mPageInfo .= "共 <font style='".$this->mCssPageInfoNumFont."'>".$this->mTotalPagesNum."</font> 页 | ";
  $this->mPageInfo .= "第 <font style='".$this->mCssPageInfoNumFont."'>".$this->mCurPageNumber."</font> 页";
  $this->mPageInfo .= "</font>";
 }

 // 取出页码索引条
 public function GetIndexBar() {
  return $this->mIndexBar;
 }

 // 取出分页信息
 public function GetPageInfo() {
  return $this->mPageInfo;
 }

}
?>

用法1: 配合数据库使用(例子中配合的是我自己的数据库操作类和模版类)
复制PHP内容到剪贴板
PHP代码:
// 这是一个sql查询语句,我们来对它的查询结果作出分页
$sql = "select * from member";

// 读取分页类
require_once("pagebreak.php");

// 分页初始化
// $sql就是上面的查询语句
// 20是每页显示的数量
// 通过分页类的初始化,这个查询语句就被加上" limit ...... "
$pagebreak = new PageBreak($sql, 20);

// 生成分页索引导航条
$navbar = $pagebreak->GetPageInfo().$pagebreak->GetIndexBar();

// 查询的结果(这里用我自己的类,不多说了)
$result = $db->GetFieldsArray($sql)

// 输出查询结果
var_dump($result);

// 输出分页索引导航条
echo $navbar;

用法2: 配合要输出的数组
复制PHP内容到剪贴板
PHP代码:
// 这是一个sql查询语句,并得到查询结果
$sql = "select * from member";
$result = $db->GetFieldsArray($sql);

// 读取分页类
require_once("pagebreak.php");

// 分页初始化
// $result就是上面的查询后得到的结果
// 20是每页显示的数量
// 通过分页类的初始化,这个结果数组被自动截取成相应页的信息内容
$pagebreak = new PageBreak($result, 20);

// 生成分页索引导航条
$navbar = $pagebreak->GetPageInfo().$pagebreak->GetIndexBar();

// 输出查询结果
var_dump($result);

// 输出分页索引导航条
echo $navbar;

下面是输出样式,
前半部分信息条,是$pagebreak->GetPageInfo()
后半部分分页索引导航,是$pagebreak->GetIndexBar()

nav.gif (670 Bytes)
2007-5-27 23:17


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

[ 本帖最后由 Moonfly 于 2007-5-27 23:23 编辑 ]

作者: Moonfly   发布时间: 2007-05-27

好东西,怎么不打个包,方便学习啊:$

作者: gmlee1999   发布时间: 2007-05-28

这个是类似新闻列表分页吧.不是新闻的内容分页.....这个是http://www.phpchina.cn/bbs/viewthread.php?tid=12999是对内容的分页..

[ 本帖最后由 webwlsong 于 2007-5-28 23:18 编辑 ]

作者: webwlsong   发布时间: 2007-05-28

作者: kenus   发布时间: 2007-05-30

非常好
有代码
有注解
有应用实例

非常期望大家都用这种形式来发代码

作者: bg6aer   发布时间: 2007-05-30

:) :) :) :)

作者: 俊客   发布时间: 2007-05-31

有个问题,就是这样ordy by ...写在哪里呢?
不懂问1下

作者: orclord   发布时间: 2007-06-01

为什么不能输出分页导航 .....  能不详细介绍下!  我是新手!

作者: cc520_chencheng   发布时间: 2007-06-01

怎么搞的这么多呀:(

作者: skyjhz   发布时间: 2007-06-01

引用:
原帖由 orclord 于 2007-6-1 09:43 发表
有个问题,就是这样ordy by ...写在哪里呢?
不懂问1下
除了limit ....信息,其他的都是些在$sql里面。
SetSqlQuery方法可以自动为$sql语句加上limit....内容。

作者: Moonfly   发布时间: 2007-06-03

一个类,臃肿,繁琐,函数的堆砌,没有见到任何面向对象的因素(有一个,那就是写了一个class PageBreak )

作者: hobbs136   发布时间: 2007-06-04

作者: �����i�i   发布时间: 2007-06-04

方便好用,强烈支持.以后就用这个啦.:lol

作者: hurrayboy   发布时间: 2007-06-04

支持一个,辛苦了:lol

作者: design_dd   发布时间: 2007-06-13

强烈支持楼主!!!! 一定要顶!

作者: 惠岸行者   发布时间: 2007-06-17

这个分页类咋用呢?

作者: qsept   发布时间: 2007-11-02

好东西,顶一下!

作者: wowolei   发布时间: 2007-11-04

鼓励原创精品!

作者: luzhou   发布时间: 2007-11-05

这段程序运行不起来!

奇怪,怎么没有看到你的mysql连接语句啊?那怎么连数据库啊!?晕乎乎!

请楼主帮忙再解释说明一下,不胜感激!

提示如下:

Warning: mysql_query() [function.mysql-query]: Access denied for user 'ODBC'@'localhost' (using password: NO) in D:\Project\test\fenye\pagebreak.php on line 69

Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in D:\Project\test\fenye\pagebreak.php on line 69

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in D:\Project\test\fenye\pagebreak.php on line 69

Fatal error: Call to a member function GetFieldsArray() on a non-object in D:\Project\test\fenye\index.php on line 18

[ 本帖最后由 奇将射天狼 于 2007-11-6 15:40 编辑 ]

作者: 奇将射天狼   发布时间: 2007-11-06