扔出一个功用比比较高的 分页类(for PHP5.x)
时间:2007-05-28
来源:互联网
这个类适用于配合数据库查询分页,和数组分页。下面有使用方法。
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;
}
}
?>
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;
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()
输出内容和样式可以很方便的在类中调整,很简单,有兴趣可以研究一下
[ 本帖最后由 Moonfly 于 2007-5-27 23:23 编辑 ]
作者: Moonfly 发布时间: 2007-05-27
作者: gmlee1999 发布时间: 2007-05-28
[ 本帖最后由 webwlsong 于 2007-5-28 23:18 编辑 ]
作者: webwlsong 发布时间: 2007-05-28



作者: kenus 发布时间: 2007-05-30
有代码
有注解
有应用实例
非常期望大家都用这种形式来发代码
作者: bg6aer 发布时间: 2007-05-30
作者: 俊客 发布时间: 2007-05-31
不懂问1下
作者: orclord 发布时间: 2007-06-01
作者: cc520_chencheng 发布时间: 2007-06-01
作者: skyjhz 发布时间: 2007-06-01
引用:
原帖由 orclord 于 2007-6-1 09:43 发表有个问题,就是这样ordy by ...写在哪里呢?
不懂问1下
SetSqlQuery方法可以自动为$sql语句加上limit....内容。
作者: Moonfly 发布时间: 2007-06-03
作者: hobbs136 发布时间: 2007-06-04

作者: �����i�i 发布时间: 2007-06-04
作者: hurrayboy 发布时间: 2007-06-04
作者: 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
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28