導航:首頁 > 編程語言 > php分頁功能的實現原理

php分頁功能的實現原理

發布時間:2024-06-03 07:40:49

php中的分頁顯示

1、前言

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

2、原理

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

每頁多少條記錄($PageSize)?
當前是第幾頁($CurrentPageID)?

現在只要再給我一個結果集,我就可以顯示某段特定的結果出來。
至於其他的參數,比如:上一頁($PreviousPageID)、下一頁($NextPageID)、總頁數($numPages)等等,都可以根據前邊這幾個東西得到。
以mysql資料庫為例,如果要從表內截取某段內容,sql語句可以用:select * from table limit offset, rows。看看下面一組sql語句,嘗試一下發現其中的規率。

前10條記錄:select * from table limit 0,10
第11至20條記錄:select * from table limit 10,10
第21至30條記錄:select * from table limit 20,10
……

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

select * from table limit ($CurrentPageID - 1) * $PageSize, $PageSize

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

3、簡單代碼
請詳細閱讀以下代碼,自己調試運行一次,最好把它修改一次,加上自己的功能,比如搜索等等。

<?php
// 建立資料庫連接
$link = mysql_connect("localhost", "mysql_user", "mysql_password")
or die("Could not connect: " . mysql_error());
// 獲取當前頁數
if( isset($_GET['page']) ){
$page = intval( $_GET['page'] );
}
else{
$page = 1;
}
// 每頁數量
$PageSize = 10;
// 獲取總數據量
$sql = "select count(*) as amount from table";
$result = mysql_query($sql);
$row = mysql_fetch_row($result);
$amount = $row['amount'];
// 記算總共有多少頁
if( $amount ){
if( $amount < $page_size ){ $page_count = 1; } //如果總數據量小於$PageSize,那麼只有一頁
if( $amount % $page_size ){ //取總數據量除以每頁數的余數
$page_count = (int)($amount / $page_size) + 1; //如果有餘數,則頁數等於總數據量除以每頁數的結果取整再加一
}else{
$page_count = $amount / $page_size; //如果沒有餘數,則頁數等於總數據量除以每頁數的結果
}
}
else{
$page_count = 0;
}

// 翻頁鏈接
$page_string = '';
if( $page == 1 ){
$page_string .= '第一頁|上一頁|';
}
else{
$page_string .= '<a href="/?page=1>";第一頁</a>|<a href="/?page='."($page-1).'>上一頁</a>|';
}
if( ($page == $page_count) || ($page_count == 0) ){
$page_string .= '下一頁|尾頁';
}
else{
$page_string .= '<a href="/?page='."($page+1).'>下一頁</a>|<a href="/?page='."$page_count.'>尾頁</a>';
}
// 獲取數據,以二維數組格式返回結果
if( $amount ){
$sql = "select * from table order by id desc limit ". ($page-1)*$page_size .", $page_size";
$result = mysql_query($sql);

while ( $row = mysql_fetch_row($result) ){
$rowset[] = $row;
}
}else{
$rowset = array();
}
// 沒有包含顯示結果的代碼,那不在討論范圍,只要用foreach就可以很簡單的用得到的二維數組來顯示結果
?>

4、OO風格代碼
以下代碼中的資料庫連接是使用的pear db類進行處理

<?php
// FileName: Pager.class.php
// 分頁類,這個類僅僅用於處理數據結構,不負責處理顯示的工作
Class Pager
{
var $PageSize; //每頁的數量
var $CurrentPageID; //當前的頁數
var $NextPageID; //下一頁
var $PreviousPageID; //上一頁
var $numPages; //總頁數
var $numItems; //總記錄數
var $isFirstPage; //是否第一頁
var $isLastPage; //是否最後一頁
var $sql; //sql查詢語句

function Pager($option)
{
global $db;
$this->_setOptions($option);
// 總條數
if ( !isset($this->numItems) )
{
$res = $db->query($this->sql);
$this->numItems = $res->numRows();
}
// 總頁數
if ( $this->numItems > 0 )
{
if ( $this->numItems < $this->PageSize ){ $this->numPages = 1; }
if ( $this->numItems % $this->PageSize )
{
$this->numPages= (int)($this->numItems / $this->PageSize) + 1;
}
else
{
$this->numPages = $this->numItems / $this->PageSize;
}
}
else
{
$this->numPages = 0;
}

switch ( $this->CurrentPageID )
{
case $this->numPages == 1:
$this->isFirstPage = true;
$this->isLastPage = true;
break;
case 1:
$this->isFirstPage = true;
$this->isLastPage = false;
break;
case $this->numPages:
$this->isFirstPage = false;
$this->isLastPage = true;
break;
default:
$this->isFirstPage = false;
$this->isLastPage = false;
}

if ( $this->numPages > 1 )
{
if ( !$this->isLastPage ) { $this->NextPageID = $this->CurrentPageID + 1; }
if ( !$this->isFirstPage ) { $this->PreviousPageID = $this->CurrentPageID - 1; }
}

return true;
}

/***
*
* 返回結果集的資料庫連接
* 在結果集比較大的時候可以直接使用這個方法獲得資料庫連接,然後在類之外遍歷,這樣開銷較小
* 如果結果集不是很大,可以直接使用getPageData的方式獲取二維數組格式的結果
* getPageData方法也是調用本方法來獲取結果的
*
***/

function getDataLink()
{
if ( $this->numItems )
{
global $db;

$PageID = $this->CurrentPageID;

$from = ($PageID - 1)*$this->PageSize;
$count = $this->PageSize;
$link = $db->limitQuery($this->sql, $from, $count); //使用Pear DB::limitQuery方法保證資料庫兼容性

return $link;
}
else
{
return false;
}
}

/***
*
* 以二維數組的格式返回結果集
*
***/

function getPageData()
{
if ( $this->numItems )
{
if ( $res = $this->getDataLink() )
{
if ( $res->numRows() )
{
while ( $row = $res->fetchRow() )
{
$result[] = $row;
}
}
else
{
$result = array();
}

return $result;
}
else
{
return false;
}
}
else
{
return false;
}
}

function _setOptions($option)
{
$allow_options = array(
'PageSize',
'CurrentPageID',
'sql',
'numItems'
);

foreach ( $option as $key => $value )
{
if ( in_array($key, $allow_options) && ($value != null) )
{
$this->$key = $value;
}
}

return true;
}
}
?>

<?php
// FileName: test_pager.php
// 這是一段簡單的示例代碼,前邊省略了使用pear db類建立資料庫連接的代碼
require "Pager.class.php";
if ( isset($_GET['page']) )
{
$page = (int)$_GET['page'];
}
else
{
$page = 1;
}
$sql = "select * from table order by id";
$pager_option = array(
"sql" => $sql,
"PageSize" => 10,
"CurrentPageID" => $page
);
if ( isset($_GET['numItems']) )
{
$pager_option['numItems'] = (int)$_GET['numItems'];
}
$pager = @new Pager($pager_option);
$data = $pager->getPageData();
if ( $pager->isFirstPage )
{
$turnover = "首頁|上一頁|";
}
else
{
$turnover = "<a href='?page=1&numItems=".$pager->numItems."'>首頁</a>|<a href="/?page=".$pager->PreviousPageID."&numItems=".$pager->numItems."'>上一頁</a>|";
}
if ( $pager->isLastPage )
{
$turnover .= "下一頁|尾頁";
}
else
{
$turnover .= "<a href="/?page=".$pager->NextPageID."&numItems=".$pager->numItems."'>下一頁</a>|<a href="/?page=".$pager->numPages."&numItems=".$pager->numItems."'>尾頁</a>";
}
?>

需要說明的地方有兩個:

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

<?php
Class MemberPager extends Pager
{
function showMemberList()
{
global $db;

$data = $this->getPageData();
// 顯示結果的代碼
// ......
}
}
/// 調用
if ( isset($_GET['page']) )
{
$page = (int)$_GET['page'];
}
else
{
$page = 1;
}
$sql = "select * from members order by id";
$pager_option = array(
"sql" => $sql,
"PageSize" => 10,
"CurrentPageID" => $page
);
if ( isset($_GET['numItems']) )
{
$pager_option['numItems'] = (int)$_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方法。

ok,寫完收功,希望花時間看完這些文字的你不覺得是浪費了時間。

㈡ php分頁原理,懂得的指教一下哈!

分頁的原理在所有的WEB語言幾乎都是差不多的!下面我來說說吧
如果你能好好研究我寫的東西,分頁將不再是問題
分頁有兩種情況
一、文件數據的分頁
二、資料庫數據的分頁
其中資料庫數據的分頁用得最多,原理也是差不多,只不過獲得數據的方法不同。
下面主要說一下資料庫數據的分頁
首先我們要明白見個量
a、頁面上要顯示的鏈接數$links(我們這里討論的不是只有上一頁和下一頁的情形,我們討論網路圖片中的分頁效果)
b、每一頁要顯示的記錄數$page_messages即一頁中顯示的數據的多少
c、當前的頁碼$page
d、資料庫中總的記錄數(不是必要,但是為保證生成分頁條正確,我們也應該考慮)
有了上面的四個量我們就可以通過他們得出分頁條的開始頁碼和結束頁碼,以及
select * from tables where fields=value limit offset,numbers中的offset和numbers
其中offset=($page-1)*$page_messages
numbers=$page_messages

其次,我們要明白在點擊分頁條中的鏈接時我們應該將相應的頁碼傳遞到後台去
即$page傳遞PHP文件,通過它來動態的生成offset,重新從數據中讀取數據

最後,在模板文件中或者直接在HTML中通過循環控制語句,將數據顯示出來

分頁條中頁碼的計算須要考慮多方面,這里不做詳述,我會在最後給你一個分頁的源碼,由於這個分頁的源碼是用面向對象寫的,所以有點難,不過你只需會用這個類的最後一個方法理解它的每一個參數就可以實現分頁.
這個分布類用到一個數據操作類所以一並給出
<?php
header("content-type:text/html;charset=utf-8");
class DB{
static private $obj = null;
static private $db_link = null;
static private $dbhost;//資料庫伺服器地址
static private $dbuser;//資料庫用戶名
static private $dbpass;//資料庫密碼
static private $dbname;//資料庫名
static private $dbcharset;//資料庫編碼
static public function ConstZhi($host,$user,$password,$dbname,$dbcharset){
self::$dbhost=$host;
self::$dbuser=$user;
self::$dbpass=$password;
self::$dbname=$dbname;
self::$dbcharset=$dbcharset;
}
static public function &Instance(){
if ( null == self::$obj ){
$class = __CLASS__;
self::$obj = new $class;
}
return self::$obj;
}

function __construct(){
self::$db_link=mysql_connect(self::$dbhost,self::$dbuser,self::$dbpass);
@mysql_select_db(self::$dbname, self::$db_link ) or die("資料庫名錯誤,請查正!".mysql_error());
@mysql_query( 'SET NAMES '.self::$dbcharset,self::$db_link ) or die("編碼設置錯誤".mysql_error());
}

function __destruct(){
self::Close();
}

static public function Close(){
if ( is_resource( self::$db_link ) ){
@mysql_close( self::$db_link );
}

self::$db_link = null;
self::$obj = null;
}

static public function EscapeString( $string ){
self::Instance();
return @mysql_real_escape_string( $string, self::$db_link );
}

static public function GetInsertId(){
self::Instance();
return intval( @mysql_insert_id(self::$db_link) );
}

static public function Query( $sql ){
self::Instance();
$result = @mysql_query( $sql, self::$db_link );
if ( $result ){
return $result;
}

self::Close();
return false;
}

static public function doInsert( $table , $arr1 ){

$sql_fd = '';
$sql_v = '';

foreach ( $arr1 as $k => $v ) {
$sql_fd .= ", `$k` ";
$sql_v .= ", '".self::EscapeString( $v )."' ";
}

$sql_fd = '('.trim( $sql_fd , ',' ).')';
$sql_v = '('.trim($sql_v , ',').')';

$sql = "INSERT INTO `$table` ".$sql_fd.' VALUES '.$sql_v;
if ( mysql_query($sql) ) {
return mysql_insert_id();
}

return false;
}

static public function doDelete( $table , $val , $fd = 'id' ) {
self::Instance();
$sql = "DELETE FROM `$table` WHERE `$fd` = ".self::EscapeString($val) ;
return self::Query( $sql , self::$db_link );
}
/**
* doDeleteXu() made by xudianyang
* */
static public function doDeleteXu( $table , $val , $fd = 'id' ) {
self::Instance();
$sql = "DELETE FROM `$table` WHERE `$fd` = ".$val;
return self::Query( $sql , self::$db_link );
}

//UPDATE `sina`.`sohu_url` SET `state` = '1' WHERE `sohu_url`.`id` =1 LIMIT 1 ;
static public function doUpdate( $table , $arr1 , $arr2 ){
self::Instance();
$sql_set = '';
foreach ( $arr2 as $k => $v ) {
$sql_set .= ", `$k` = '".self::EscapeString($v)."' ";
}
$sql_set = trim( $sql_set , ',' );
$arr_w = array();
foreach ( $arr1 as $k => $v ){
$arr_w[] = " `".self::EscapeString($k)."` = '".self::EscapeString($v)."' ";
}
$sql = "UPDATE `$table` SET $sql_set WHERE ".implode('and' , $arr_w);
if ( self::Query($sql) )
return true;

return false;
}

static public function getRows( $table , $arr=array() , $one = 0 ) {
self::Instance();
if ( empty($arr) ){
$sql = "SELECT * FROM `$table`";
}else{
$arr_w = array();
foreach ( $arr as $k => $v ){
if(is_numeric($v))
$arr_w[] = " `".self::EscapeString($k)."` = ".self::EscapeString($v);
else
$arr_w[] = " `".self::EscapeString($k)."` = '".self::EscapeString($v)."' ";
}
$sql = "SELECT * FROM `$table` WHERE ".implode(' and' , $arr_w)." ORDER BY `id` ASC";
//echo $sql ;
}

if ( $ret = self::Query($sql) ){
if ( $one ){
return mysql_fetch_assoc( $ret );
}else{
$arr_out = array();
while( $row = mysql_fetch_assoc( $ret ) ){
$arr_out[] = $row;
}
return $arr_out;
}
}

return false;
}

static private function makeWhere( $arr ){
$arr_w = array();
foreach ( $arr as $k => $v ){
$arr_w[] = " `".self::EscapeString($k)."` = '".self::EscapeString($v)."' ";
}
return implode('and' , $arr_w);
}

static public function getCount( $table , $arr ){
if ( is_array($arr) and count($arr) > 0 ) {
$sql = "SELECT COUNT(*) n FROM `$table` WHERE ". self::makeWhere($arr);
if ( $ret = self::Query($sql) ){
$tmep = mysql_fetch_assoc( $ret );
return $tmep['n'];
}
}
return false;
}

/**
* getCountXu() made by xudianyang
* */
static public function getCountXu( $table , $arr ){
$sql = "SELECT COUNT(*) n FROM `$table`" ;
if ( $ret = self::Query($sql) ){
$tmep = mysql_fetch_assoc( $ret );
return $tmep['n'];
}
return false;
}

static public function getQueryResult( $sql, $one=false ){
$ret = array();
if ( $result = self::Query($sql) ){
while ( $row = mysql_fetch_assoc($result) ){
//$row = array_change_key_case($row, CASE_LOWER);
if ( $one ){
$ret = $row;
break;
}else{
array_push( $ret, $row );
}
}
@mysql_free_result( $result );
}
return $ret;
}
}

可以在類中配置你自己的資料庫伺服器相應的賬號和密碼

<?php
class Fenye{
private $mDB;
public function __construct(DB $obj){
$this->mDB=$obj;
}
/**
* 計算總共的頁數
*
* @param string $table 表名
* @param array $conditon 查詢的條件
* @param integer $message_number 每頁顯示的記錄數
* @return array */
public function getPageAll($table,$condition,$message_number){
if($condition == ""){
$recodernum=$this->mDB->getCountXu($table,$condition);
}else{
$recodernum=$this->mDB->getCount($table,$condition);
}
$arrnumber['all']=$recodernum;
$arrnumber['page_all']= ceil($recodernum/$message_number);
return $arrnumber;
}
/**
* 生成查詢的SQL語句
*
*@param string $table 需要查詢的表
*@param array $conditon 查詢的條件
*@param array $arr 查詢的欄位所組成的一個數組
*@param mixed $order 表示排序方式
*@param array $limit 表示指定查詢記錄的數目
*@return string
**/

public function createSQL($table,$condition,$arr,$order,$limit){
if ($table == ""){
return false;
}else{
$str1="";
$str2="";
$str3="";
$str4="";
$n=0;
$m=0;
$p=0;
if ($arr == ""){
$str1="*";
}else{
foreach ($arr as $value){
$p++;
if ($p == 1){
$str1.=$value;
}else{
$str1.=",".$value;
}
}
}
if($condition == ""){
$str2="";
}else{
foreach ($condition as $key => $value){
$n++;
if ($n == 1){
$str2.="where ".$key."="."'".$value."'";
}else{
$str2.=" and ".$key."="."'".$value."'";
}
}
}
if($order == ""){
$str3="";
}else{
foreach ($order as $key => $value){
$m++;
if ($m == 1){
$str3.=" order by ".$key." ".$value;
}else{
$str3.=",".$key." ".$value;
}
}
}
if ($limit == ""){
$str4="";
}else{
$str4="limit ".$limit[0].",".$limit[1];
}
$sql="select ".$str1." from ".$table." ".$str2.$str3." ".$str4;
}
return $sql;
}
/**
*獲取當前頁面應有的信息
*
*@param integer $page 當前的頁碼
*@param integer $message_number 每頁顯示的記錄數
*@param integer $pageall 總共的頁數
*@param string $sql 待執行的SQL語句
*@return array
*/
public function getPageInformation($page,$page_all,$message_number,$sql){
$start=0;//開始的頁碼
$end=0;//結束的頁碼
$arr=array();//返回的結果儲存在這個數組中
$left=intval($message_number/2);
$start=$page-$left;
$end=$page+$left;
if($message_number <= $page_all){//判斷總的頁數是否大於每一頁的鏈接數
if($end <= $message_number){
$end=$message_number;
}
}else{
$end=$page_all;
}
if($start <= 0){
$start=1;
}
if($end >= $page_all){
$start=$page_all-$message_number+1;
if($start <= 0){
$start=1;
}
$end=$page_all;
}
if($page < 1){
$page=1;
$start=1;
if($page_all <= $message_number){
$end=$page_all;
}
$end=$message_number;
}
if($page >= $page_all){
$page=$page_all;
$start=$page-$message_number+1;
if($start <= 0){
$start=1;
}
$end=$page;
}
$result=$this->mDB->Query($sql);
if($result){
for(;;){
$=mysql_fetch_assoc($result);
if($){
$arr1[]=$;
}else{
break;
}
}
}
$arr['start']=$start;
$arr['end']=$end;
$arr['page_all']=$page_all;
$arr['page']=$page;
$arr['content']=@ $arr1;
return $arr;
}
/**
* 修改傳遞的頁碼使其合法
*
* @param integer $page 傳遞過來的頁碼
* @param integer $page_all 總的頁碼
* @return integer*/
public function checkPage($page,$page_all){
if($page < 1){
$page=1;
}
if($page >= $page_all){
$page=$page_all;
}
return $page;
}
/**
* 生成分頁條
*
* @param integer $page 當前頁碼
* @param integer $start 分頁條開始頁碼
* @param integer $end 分頁條結束的頁碼
* @param integer $page_all 總共頁碼數
* @param string $otherquery 需要傳遞的其他參數 如&string=Publisher
* @return string
* */
public function createFenYeTiao($page,$start,$end,$page_all,$otherquery=''){
$str="";
if($page == 1){
$str.='首頁'." ".'上一頁'." ";
}else{
$str.="<a href='?page=1".$otherquery."' target='_self'>".'首頁'."</a>"." ";
$str.="<a href='?page=".($page-1).$otherquery."' target='_self'>".'上一頁'."</a>"." ";
}

for($i=$start;$i<=$end;$i++){
if($page == $i){
$str.="<a href='?page=".$page.$otherquery."' target='_self'>".$page."</a>"." ";
}else{
$str.="<a href='?page=".$i.$otherquery."' target='_self'>[".$i."]</a>"." ";
}
}
if($page == $page_all){
$str.='下一頁'." ".'尾頁';
}else{
$str.="<a href='?page=".($page+1).$otherquery."' target='_self'>".'下一頁'."</a>"." ";
$str.="<a href='?page=".$page_all.$otherquery."' target='_self'>".'尾頁'."</a>"." ";
}
return $str;
}
/**
* 完成分頁所有操作
*
*@param string $table 需要查詢的表
*@param array $conditon 查詢的條件
*@param array $arrField 查詢的欄位所組成的一個數組
*@param mixed $order 表示排序方式
*@param integer $page 當前頁碼
*@param integer $mess_num 每頁顯示的記錄數
*@param integer $page_link 顯示的鏈接數目
*@param string $otherquery 點擊分頁頁碼時需要傳遞的其他參數,默認為空
*@return array 包括分頁條和從資料庫讀得的數據分別保存在索引為content和fenyetiao的兩個元素中,注意
*索引為content的元素為一個二維數組*/
public function FinishFenYe($table,$condition,$arrField,$order,$page,$mess_num,$page_link,$otherquery){
$allnumber=$this->getPageAll($table,"",$mess_num);
$page_all=$allnumber['page_all'];
$page=$this->checkPage($page,$page_all);
$limitoffet=($page-1)*$mess_num;
$limit=array($limitoffet,$mess_num);
$sql=$this->createSQL($table,$condition,$arrField,$order,$limit);
$resarr=$this->getPageInformation($page,$page_all,$page_link,$sql);
$resarr['page']=$this->checkPage($resarr['page'],$resarr['page_all']);
$fenyetiao=$this->createFenYeTiao($resarr['page'],$resarr['start'],$resarr['end'],$resarr['page_all'],$otherquery);
$resarr['fenyetiao']=$fenyetiao;
$resarr['all']=$allnumber['all'];
return $resarr;
}
}
?>

祝你成功!

㈢ php分頁代碼 怎麼寫

Web開發是今後分布式程式開發的主流,通常的web開發都要涉及到與資料庫打交道,客戶端從伺服器端讀取通常都是以分頁的形式來顯示,一頁一頁的閱讀起來既方便又美觀。所以說寫分頁程序是web開發的一個重要組成部分,在這里,我們共同來研究分頁程序的編寫。

一、分頁程序的原理

分頁程序有兩個非常重要的參數:每頁顯示幾條記錄($pagesize)和當前是第幾頁($page)。有了這兩個參數就可以很方便的寫出分頁程序,我們以MySql資料庫作為數據源,在mysql里如果要想取出表內某段特定內容可以使用的 T-SQL語句:select * from table limit offset,rows來實現。這里的offset是記錄偏移量,它的計算方法是offset=$pagesize*($page-1),rows是要顯示的記錄條數,這里就是$page。也就是說select * from table limit 10,10這條語句的意思是取出表裡從第11條記錄開始的20條記錄。

二、主要代碼解析

$pagesize=10; //設置每一頁顯示的記錄數
$conn=mysql_connect("localhost","root",""); //連接資料庫
$rs=mysql_query("select count(*) from tb_proct",$conn); //取得記錄總數$rs
$myrow = mysql_fetch_array($rs);
$numrows=$myrow[0];

//計算總頁數

$pages=intval($numrows/$pagesize);

//判斷頁數設置

if (isset($_GET['page'])){
$page=intval($_GET['page']);
}
else{
$page=1; //否則,設置為第一頁
}

三、創建用例用表myTable

create table myTable(id int NOT NULL auto_increment,news_title varchar(50),news_cont text,add_time datetime,PRIMARY KEY(id))

四、完整代碼

<html>
<head>
<title>php分頁示例</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>

<body>
<?php
$conn=mysql_connect("localhost","root","");
//設定每一頁顯示的記錄數
$pagesize=1;
mysql_select_db("mydata",$conn);
//取得記錄總數$rs,計算總頁數用
$rs=mysql_query("select count(*) from tb_proct",$conn);
$myrow = mysql_fetch_array($rs);
$numrows=$myrow[0];
//計算總頁數

$pages=intval($numrows/$pagesize);
if ($numrows%$pagesize)
$pages++;
//設置頁數
if (isset($_GET['page'])){
$page=intval($_GET['page']);
}
else{
//設置為第一頁
$page=1;
}
//計算記錄偏移量
$offset=$pagesize*($page - 1);
//讀取指定記錄數
$rs=mysql_query("select * from myTable order by id desc limit $offset,$pagesize",$conn);
if ($myrow = mysql_fetch_array($rs))
{
$i=0;
?>
<table border="0" width="80%">
<tr>
<td width="50%" bgcolor="#E0E0E0">
<p align="center">標題</td>
<td width="50%" bgcolor="#E0E0E0">
<p align="center">發布時間</td>
</tr>
<?php
do {
$i++;
?>
<tr>
<td width="50%"><?=$myrow["news_title"]?></td>
<td width="50%"><?=$myrow["news_cont"]?></td>
</tr>
<?php
}
while ($myrow = mysql_fetch_array($rs));
echo "</table>";
}
echo "<div align='center'>共有".$pages."頁(".$page."/".$pages.")";
for ($i=1;$i< $page;$i++)
echo "<a href='fenye.php?page=".$i."'>[".$i ."]</a> ";
echo "[".$page."]";
for ($i=$page+1;$i<=$pages;$i++)
echo "<a href='fenye.php?page=".$i."'>[".$i ."]</a> ";
echo "</div>";
?>
</body>
</html>

五、總結

本例代碼在windows2000 server+php4.4.0+mysql5.0.16上運行正常。該示例顯示的分頁格式是[1][2][3]…這樣形式。假如想顯示成「首頁 上一頁 下一頁 尾頁」這樣形式,請加入以下代碼:

$first=1;
$prev=$page-1;
$next=$page+1;
$last=$pages;

if ($page > 1)
{
echo "<a href='fenye.php?page=".$first."'>首頁</a> ";
echo "<a href='fenye.php?page=".$prev."'>上一頁</a> ";
}

if ($page < $pages)
{
echo "<a href='fenye.php?page=".$next."'>下一頁</a>
echo "<a href='fenye.php?page=".$last."'>尾頁</a> ";
}

其實,寫分頁顯示代碼是很簡單的,只要掌握了它的工作原理。希望這篇文章能夠帶給那些需要這方面程序web程序員的幫助。

㈣ php應該怎樣分頁

我也和你一樣,看了好多例子都不懂,後來看了這個,總算搞懂了。這個還算簡單,是說的php mysql的分頁。

正文:
在看本文之前,請確保你已掌握了PHP的一些知識以及MYSQL的查詢操作基礎哦。

作為一個Web程序,經常要和不計其數的數據打交道,比如會員的數據,文章數據,假如只有幾十個會員那很好辦,在一頁顯示就可以了,可是假如你的網站是幾千甚至幾十萬會員的話,如果都在一頁打開的話無論對瀏覽器還是觀看者都是一種折磨。

相信每個學習PHP的新手都會對分頁這個東西感覺很頭疼,不過有了默默的這一水帖,你肯定會拍拍腦袋說,嘿,原來分頁竟然如此簡單?的確,現在請深呼吸一口新鮮的空氣,仔細的聽默默給你一點一點的分解。

假設我們要處理1000條數據,要在每頁中顯示10條,這樣的話就會分100頁來顯示,咱們先看一看在mysql里提取10條信息是如何操作的。

Select * from table limit 0,10

上面是一句很簡單的mysql查詢語句,它的作用是從一個名叫table的表裡提取10條數據,並且把所有欄位的值都獲得。

關鍵的地方就在這段「limit 0,10」,它其中的0是以0為起始點,後面的10則是顯示10條數據,那麼我們要以10為起始點,顯示到第20條數據該怎麼寫呢?

可能很多大大會心直口快的說「limit 10,20」嘛!啊哦,這樣可就錯誤了哦,正確的寫法是「limit 10,10」它後面的參數並非是結束點而是要提取的數目,記住哦。

懂得了如何提取10條數據,那麼提取1000條也就是做100次這種查詢呀,就是說要做如下的查詢:

Limit 0,10 //第一頁
Limit 10,10 //第二頁
Limit 20,10 //第三頁
Limit 30,10 //第四頁
……
看出有什麼規律了嗎?沒錯,第一個參數每翻一頁就增加10,可是第二個參數是不變的。
也就是說咱們設法根據頁數來改變第一個參數的值,就可以進行分頁顯示數據了,怎麼樣,原理是不是很簡單?

可是要怎麼設法根據頁數來改變第一個參數的值呢?首先,咱們要有一個頁數的值,用url的GET方式獲取。
比如index.php?page=18
相信大部分的大大對這個東西不陌生吧,這種url地址可是隨處可見,其中的page參數的作用就是傳入要顯示的頁數。

咱們通過一段代碼來看一看究竟是如何實現的吧:

PHP代碼如下:

/*

Author:默默
Date :2006-12-03

*/

$page=isset($_GET['page'])?intval($_GET['page']):1; //這句就是獲取page=18中的page的值,假如不存在page,那麼頁數就是1。
$num=10; //每頁顯示10條數據

$db=mysql_connect("host","name","pass"); //創建資料庫連接
$select=mysql_select_db("db",$db); //選擇要操作的資料庫

/*
首先咱們要獲取資料庫中到底有多少數據,才能判斷具體要分多少頁,具體的公式就是
總數據數除以每頁顯示的條數,有餘進一。
也就是說10/3=3.3333=4 有餘數就要進一。
*/

$total=mysql_num_rows(mysql_query("select id from table")); //查詢數據的總數,id是資料庫中的一個自動賦值的欄位
$pagenum=ceil($total/$num); //獲得總頁數

//假如傳入的頁數參數大於總頁數,則顯示錯誤信息
If($page>$pagenum || $page == 0){
Echo "Error : Can Not Found The page .";
Exit;
}

$offset=($page-1)*$num; //獲取limit的第一個參數的值,假如第一頁則為(1-1)*10=0,第二頁為(2-1)*10=10。

$info=mysql_query("select name from table limit $offset,$num"); //獲取相應頁數所需要顯示的數據,name是數據里的一個欄位
While($it=mysql_fetch_array($info)){
Echo $it['name']."
";
} //顯示數據

For($i=1;$i<=$pagenum;$i++){

$show=($i!=$page)?"$i":"$i";
Echo $show." ";
}

/*顯示分頁信息,假如是當頁則顯示粗體的數字,其餘的頁數則為超連接,假如當前為第三頁則顯示如下
1 2 3 4 5 6
*/
?>

㈤ PHP分頁問題. 望大蝦開示

1.$_GET[page] 是你點擊 上一頁 或者 下一頁 傳遞過來的, 當你的頁面初始化的時候 也就是你沒還沒點擊上一頁 下一頁 的時候 他應該是0
2.$page.=','; 這個的意思是 $page = $page . ','; 他是用來拼寫SQL 語句的
拼寫後 你的SQL 應該是 select * from message limit 0,5; 注意看 0 和之間 有個 逗號 代表 從結果集的第一行數據 往下取5 行

3.分頁其實非常簡單 比如說你有26記錄 每5條為一頁 26條記錄能分幾頁啊 ? 當然是 6頁了...
可是計算機不知道 你就給他一個演算法
記住公式 (總的記錄條數 + 每頁的記錄數 - 1) / 每頁的記錄數
咱們用公式算一下 (26 + 5 -1) / 5 = 6
然後我們看下SQL $sql="select * from message limit $page $pagesize ";
第1頁的時候 是 limit 0,5
第2頁的時候 是 limit 5,5
第2頁的時候 是 limit 10,5
剛才也說了 limit 是從第幾行數據 往下 走 幾行 因為咱們是 5條數據一分也所以 第2個參數永遠都不用變就是5 ,第一個參數 非常好算 每頁的記錄數 * (當前頁數 - 1)
第1頁的時候 是 5*(1-1)=0
第2頁的時候 是 5*(2-1)=5
第1頁的時候 是 5*(3-1)=10

還有說的就是你的代碼 問題很嚴重 . php 5.3 版本 你這程序根本就運行不了....
$_GET['page'] 這個樣寫才標准. 不要以為PHP 單引號 和 雙引號 沒有任何差別 單引號的速度要比 雙引號 快3倍. $_GET[page] 這種寫法 5.3 以後直接就報錯了. 建議你馬上升級為5.3 或更高的版本 養成一個練好的編寫代碼習慣.

閱讀全文

與php分頁功能的實現原理相關的資料

熱點內容
龍之召喚伺服器如何 瀏覽:119
linux目錄跳轉 瀏覽:368
程序員和老闆稱兄道弟 瀏覽:759
直播網路連接源碼 瀏覽:736
用安卓手機怎麼登錄蘋果手機id 瀏覽:710
論文查重工具源碼 瀏覽:401
android銀聯demo 瀏覽:86
智能演算法發展 瀏覽:351
房車露營地用什麼app 瀏覽:70
spark編程指南python 瀏覽:553
phparray源碼 瀏覽:1002
安卓手機反應有點慢怎麼辦 瀏覽:705
c語言怎麼訪問伺服器並獲取數據 瀏覽:114
怎麼下載三維app 瀏覽:77
把pdf中的圖片導出到excel 瀏覽:505
php操作redis實例 瀏覽:143
蘋果app怎麼綁卡 瀏覽:978
便簽加密的筆記在哪裡打開 瀏覽:845
php截取時間函數 瀏覽:867
lol手游版怎麼下載安卓版 瀏覽:81