当前位置:编程学习 > php >>

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




扔出一个功用比比较高的 分页类(for PHP5.x)
解决方法
怕水平的不高,所以从来没有放过任何代码,这个类我已经用了很久,近来用面向对象方法重写,适用于PHP5.x,特地扔出,不怕见笑,希望抛砖引玉。
这个类适用于配合数据库查询分页,和数组分页。下面有使用方法。

/*

* 名称: 分页类

* 介绍: 适用于数组分页和配合sql查询的分页

* 作者: idlion || Moonfly ([email=id_lion@hotmail.com]id_lion@hotmail.com[/email])

* 创建时间: 20060218

* 最后修改: 20070524

*/

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 = "8";

private $mPreButton = "7";

private $mFirstButton = "9";

private $mLastButton = ":";

private $mCssIndexBarCurPage = "fontweight: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>mTotalRowsNum1)/$this>mPageRowsNum )+1 );

}



// 计算当前页数

private function SetCurPageNumber() {

if( $_GET['cur_page'] ) {

$this>mCurPageNumber = $_GET['cur_page'];

}

}



// 修正Sql截取语句

private function SetSqlQuery(&$rSqlQuery) {

$start_number = ($this>mCurPageNumber1)*$this>mPageRowsNum;

$rSqlQuery .= " LIMIT ".$start_number.",".$this>mPageRowsNum;

}



// 修正截取后的Array

private function SetArray(&$rArray) {

$start_number = ($this>mCurPageNumber1)*$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>mIndexBarLength1;

}

$last_number;

for( $i=$first_number; $i<=$last_number; $i++ ) {

if( $this>mCurPageNumber == $i ) {

$page_index .= "".$i." ";

}

else {

$page_index .= "mQueryString.$i."' style='".$this>mCssIndexBarPage."'>".$i." ";

}

}

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 "mQueryString."1'>".$this>mFirstButton." ";

}



// 得到页码索引条 上一页按钮

private function GetNavPreButton() {

if( $this>mCurPageNumber>1 ) {

$pre_number = $this>mCurPageNumber1;

}

else {

$pre_number = 1;

}

return "mQueryString.$pre_number."'>".$this>mPreButton." ";

}



// 得到页码索引条 下一页按钮

private function GetNavNextButton() {

if( $this>mCurPageNumber<$this>mTotalPagesNum ) {

$next_number = $this>mCurPageNumber+1;

}

else {

$next_number = $this>mTotalPagesNum;

}

return "mQueryString.$next_number."'>".$this>mNextButton." ";

}



// 得到页码索引条 末页按钮

private function GetNavLastButton() {

return "mQueryString.$this>mTotalPagesNum."'>".$this>mLastButton." ";

}



// 设置分页信息

private function SetPageInfo() {

$this>mPageInfo ="";

$this>mPageInfo .= "共 ".$this>mTotalRowsNum." 条信息 | ";

$this>mPageInfo .= "".$this>mPageRowsNum." 条/页 | ";

$this>mPageInfo .= "共 ".$this>mTotalPagesNum." 页 | ";

$this>mPageInfo .= "第 ".$this>mCurPageNumber." 页";

$this>mPageInfo .= "
";

}



// 取出页码索引条

public function GetIndexBar() {

return $this>mIndexBar;

}



// 取出分页信息

public function GetPageInfo() {

return $this>mPageInfo;

}



}

?>


复制代码用法1: 配合数据库使用(例子中配合的是我自己的数据库操作类和模版类) // 这是一个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: 配合要输出的数组 // 这是一个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()



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

[ ]
附件: 您所在的用户组无法下载或查看附件

D8888D回贴内容
好东西,怎么不打个包,方便学习啊:$
D8888D回贴内容
这个是类似新闻列表分页吧.不是新闻的内容分页.....这个是[url=http://www.phpchina.cn/bbs/viewthread.php?tid=12999]链接标记http://www.phpchina.cn/bbs/viewthread.php?tid=12999[/url]是对内容的分页..

[ ]
D8888D回贴内容
[img]http://www.phpchina.com/bbs/images/smilies/default/victory.gif[/img] [img]http://www.phpchina.com/bbs/images/smilies/default/victory.gif[/img][img]http://www.phpchina.com/bbs/images/smilies/default/victory.gif[/img]
D8888D回贴内容
非常好
有代码
有注解
有应用实例

非常期望大家都用这种形式来发代码
D8888D回贴内容
:) :) :) :)
D8888D回贴内容
有个问题,就是这样ordy by ...写在哪里呢?
不懂问1下
D8888D回贴内容
为什么不能输出分页导航 ..... 能不详细介绍下! 我是新手!
D8888D回贴内容
怎么搞的这么多呀:(
D8888D回贴内容
原帖由 orclord 于 200761 09:43 发表 [url=http://www.phpchina.com/bbs/redirect.php?goto=findpost&pid=201879&ptid=26485]链接标记[img]http://www.phpchina.com/bbs/images/common/back.gif[/img][/url]
有个问题,就是这样ordy by ...写在哪里呢?
不懂问1下
除了limit ....信息,其他的都是些在$sql里面。
SetSqlQuery方法可以自动为$sql语句加上limit....内容。

补充:Php教程,常见问题 
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,