PHP&MYSQL分頁原理及實現

來源:互聯網
上載者:User

原文:http://www.sudu.cn/info/html/edu/php/20071031/9391.html

 

作為一個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:mm

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']."<br />";
}                                                              //顯示資料
   
For($i=1;$i<=$pagenum;$i++){
       
       $show=($i!=$page)?"<a href='index.php?page=".$i."'>$i</a>":"<b>$i</b>";
       Echo $show." ";
}

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

假如您仔細的讀過上面的代碼,把資料庫連接和查詢的表替換成您的,那麼就能看見他的執行效果哦。

是不是很簡單,只要動動腦筋,能夠讓他顯示的更為個人化哦,給大家出一個小題,如何?“首頁 上一頁 下一頁 尾頁”這種格式的分頁呢?

提問,代碼,如下:
<?php

/*

Author:MM
Date  :2006-12-03

*/

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

$db=mysql_connect("localhost","root","7529639");           //建立資料庫連接
mysql_select_db("cr_download");                 //選擇要操作的資料庫

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

$result=mysql_query("select * from cr_userinfo");
$total=mysql_num_rows($result); //查詢任何的資料

$url='test.php';//擷取本頁URL

//頁碼計算
$pagenum=ceil($total/$num);                                    //獲得總頁數,也是最後一頁
$page=min($pagenum,$page);//獲得首頁
$prepg=$page-1;//上一頁
$nextpg=($page==$pagenum ? 0 : $page+1);//下一頁
$offset=($page-1)*$num;                                        //擷取limit的第一個參數的值,假如第一頁則為(1-1)*10=0,第二頁為(2-1)*10=10。

//開始分頁導航條代碼:
$pagenav="顯示第 <B>".($total?($offset+1):0)."</B>-<B>".min($offset+10,$total)."</B> 條記錄,共 $total 條記錄 ";

//假如只有一頁則跳出函數:
if($pagenum<=1) return false;

$pagenav.=" <a href='$url?page=1'>首頁</a> ";
if($prepg) $pagenav.=" <a href='$url?page=$prepg'>前頁</a> "; else $pagenav.=" 前頁 ";
if($nextpg) $pagenav.=" <a href='$url?page=$nextpg'>後頁</a> "; else $pagenav.=" 後頁 ";
$pagenav.=" <a href='$url?page=$pagenum'>尾頁</a> ";

//下拉捷徑清單,迴圈列出任何頁碼:
$pagenav.=" 到第 <select name='topage' size='1' ōnchange='window.location=\"$url?page=\"+this.value'>\n";
for($i=1;$i<=$pagenum;$i++){
if($i==$page) $pagenav.="<option value='$i' selected>$i</option>\n";
else $pagenav.="<option value='$i'>$i</option>\n";
}
$pagenav.="</select> 頁,共 $pagenum 頁";

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

$info=mysql_query("select * from cr_userinfo limit $offset,$num");   //擷取相應頁數所需要顯示的資料
While($it=mysql_fetch_array($info)){
       Echo $it['username'];
       echo "<br>";
}                                                              //顯示資料
  echo"<br>";
  echo $pagenav;//輸出分頁導航
  
?>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.