PHP 分頁原理解析

2021-06-05 18:17:37 字數 4209 閱讀 1123

分頁顯示是一種非常常見的瀏覽和顯示大量資料的方法,屬於web程式設計中最常處理的事件之一。對於web程式設計的老手來說,編寫這種**實在是和呼吸一樣自然,但是對於初學者來說,常常對這個問題摸不著頭緒,因此特地撰寫此文對這個問題進行詳細的講解,力求讓看完這篇文章的朋友在看完以後對於分頁顯示的原理和實現方法有所了解。本文適合初學者閱讀,所有示例**均使用php編寫。

所謂分頁顯示,也就是將資料庫中的結果集人為的分成一段一段的來顯示,這裡需要兩個初始的引數:

每頁多少條記錄($pagesize)?

當前是第幾頁($currentpageid)?

現在只要再給我乙個結果集,我就可以顯示某段特定的結果出來。

以mysql資料庫為例,如果要從表內擷取某段內容,sql語句可以用:select * from table limit offset, rows。看看下面一組sql語句,嘗試一下發現其中的規率。

select * from

table limit 0,10 // 前10條記錄  

select * from

table limit 10,10 // 第11至20條記錄  

select * from

table limit 20,10 // 第21至30條記錄  

……    

這一組sql語句其實就是當$pagesize=10的時候取表內每一頁資料的sql語句,我們可以總結出這樣乙個模板:

select * from

table limit ($currentpageid - 1) * $pagesize, $pagesize    

拿這個模板代入對應的值和上邊那一組sql語句對照一下看看是不是那麼回事。搞定了最重要的如何獲取資料的問題以後,剩下的就僅僅是傳遞引數,構造合適的sql語句然後使用php從資料庫內獲取資料並顯示了。以下我將用具體**加以說明。

請詳細閱讀以下**,自己除錯執行一次,最好把它修改一次,加上自己的功能,比如搜尋等等。

<?php  

// 建立資料庫連線

$link = mysql_connect("localhost", "mysql_user", "mysql_password")   

ordie("could not connect: " . mysql_error());   

// 獲取當前頁數

if( isset($_get['page']) )  

else   

// 每頁數量

$pagesize = 10;   

// 獲取總資料量

$sql = "select count(*) as amount from table";  

$result = mysql_query($sql);  

$row = mysql_fetch_row($result);  

$amount = $row['amount'];   

// 記算總共有多少頁

if( $amount )        //如果總資料量小於$pagesize,那麼只有一頁

if( $amount % $page_size )else  

}  else  

// 翻頁鏈結

$page_string = '';  

if( $page == 1 )  

else   

if( ($page == $page_count) || ($page_count == 0) )  

else  

// 獲取資料,以二維陣列格式返回結果

if( $amount )  

}else  

// 沒有包含顯示結果的**,那不在討論範圍,只要用foreach就可以很簡單的用得到的二維陣列來顯示結果

?>   

oo風格**,以下**中的資料庫連線是使用的pear db類進行處理

<?php  

// filename: pager.class.php

// 分頁類,這個類僅僅用於處理資料結構,不負責處理顯示的工作

class pager  

// 總頁數

if ( $this->numitems > 0 )  

if ( $this->numitems % $this->pagesize )  

else

}  else

switch ( $this->currentpageid )  

if ( $this->numpages > 1 )  

if ( !$this->isfirstpage )   

}  return true;  

}  /***

** 返回結果集的資料庫連線

* 在結果集比較大的時候可以直接使用這個方法獲得資料庫連線,然後在類之外遍歷,這樣開銷較小

* 如果結果集不是很大,可以直接使用getpagedata的方式獲取二維陣列格式的結果

* getpagedata方法也是呼叫本方法來獲取結果的

****/

function getdatalink()  

else

}  /***

** 以二維陣列的格式返回結果集

****/

function getpagedata()  

}  else

return

$result;  

}  else

}  else

}  function _setoptions($option)  

}  return true;  

}  }  

?>  

<?php  

// filename: test_pager.php

// 這是一段簡單的示例**,前邊省略了使用pear db類建立資料庫連線的** 

require

"pager.class.php";   

if ( isset($_get['page']) )  

else

$sql = "select * from table order by id";   

$pager_option = array(  

"sql" => $sql,  

"pagesize" => 10,  

"currentpageid" => $page

);   

if ( isset($_get['numitems']) )  

$pager = @new pager($pager_option);   

$data = $pager->getpagedata();   

if ( $pager->isfirstpage )  

else

if ( $pager->islastpage )

else

?>    

需要說明的地方有兩個:

這個類僅僅處理資料,並不負責處理顯示,因為我覺得將資料的處理和結果的顯示都放到乙個類裡邊實在是有些勉強。顯示的時候情況和要求多變,不如自己根據類給出的結果處理,更好的方法是根據這個pager類繼承乙個自己的子類來顯示不同的分頁,比如顯示使用者分頁列表可以:

<?php  

class memberpager extends pager  

}   

/// 呼叫

if ( isset($_get['page']) )  

else

$sql = "select * from members order by id";   

$pager_option = array(  

"sql" => $sql,  

"pagesize" => 10,  

"currentpageid" => $page

);   

if ( isset($_get['numitems']) )  

$pager = @new memberpager($pager_option);   

$pager->showmemberlist();  

?>    

第二個需要說明的地方就是不同資料庫的相容性,在不同的資料庫裡截獲一段結果的寫法是不一樣的。

mysql: select * from

table limit offset, rows

pgsql: select * from

table limit m offset n  

......    

所以要在類裡邊獲取結果的時候需要使用pear db類的limitquery方法。

php分頁原理

1 首先了解sql語句中的limit用法 select from table limit 開始位置 操作條數 其中開始位置是從0開始的 例子 取前20條記錄 select from table limit 0 20 從第11條開始取20條記錄 select from table limit 10 2...

php分頁原理

1 首先了解sql語句中的limit用法 select from table limit 開始位置 操作條數 其中開始位置是從0開始的 例子 取前20條記錄 select from table limit 0 20 從第11條開始取20條記錄 select from table limit 10 2...

PHP分頁原理

分頁顯示是一種非常常見的瀏覽和顯示大量資料的方法,屬於web程式設計中最常處理的事件之一。對於web程式設計的老手來說,編寫這種 實在是和呼吸一樣自然,但是對於初學者來說,常常對這個問題摸不著頭緒,因此特地撰寫此文對這個問題進行詳細的講解。所謂分頁顯示,也就是將資料庫中的結果集人為的分成一段一段的來...