扔出一個功用比比較高的 分頁類(for PHP5.x)
解決方法
怕水平的不高,所以從來沒有放過任何代碼,這個類我已經用了很久,近來用面向對象方法重寫,適用於PHP5.x,特地扔出,不怕見笑,希望拋磚引玉。
這個類適用於配合數據庫查詢分頁,和數組分頁。下面有使用方法。
/*
* 名稱: 分頁類
* 介紹: 適用於數組分頁和配合sql查詢的分頁
* 作者: idlion || Moonfly ([[email protected]][email protected][/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....內容。