首頁 >後端開發 >php教程 >php分頁原理與頁面跳轉實例

php分頁原理與頁面跳轉實例

WBOY
WBOY原創
2016-07-25 08:52:461627瀏覽
  1. select * from table limit 0,10 // 前10筆記錄
  2. select * from table limit 10,10 // 第11至20筆記錄
  3. select * from table limit 20,10 // 第21至30筆記錄
  4. ……
複製程式碼

這一組語句其實就是當$pagesize=10的時候取表內每一頁資料的sql語句,我們可以總結出這樣一個模板: select * from table limit ($currentpageid - 1) * $pagesize, $pagesize 拿這個模板代入對應的值和上邊那一組sql語句對照一下看看是不是那麼回事。搞定了最重要的如何取得資料的問題以後,剩下的就只是傳遞參數,建構合適的sql語句然後使用php從資料庫內取得資料並顯示了。

php分頁程式碼:

  1. // 建立資料庫連線
  2. $link = mysql_connect("localhost", "mysql_user", "mysql_pass", "mysql_pass")
  3. or die("could not connect: " . mysql_error());
  4. // 取得目前頁數
  5. if( isset($_get['page']) ){
  6. $page = intval ( $_get['page'] );
  7. }
  8. else{
  9. $page = 1;
  10. }
  11. // 每頁數
  12. $pagesize = 10;
  13. // 取得總資料量
  14. $sql = "select count(*) as amount from table";
  15. $result = mysql_query($sql);
  16. $row = mysql_fetch_row($result);
  17. $amount = $row['amount'];
  18. // 記算總共有多少頁
  19. if( $amount ){
  20. if( $amount if( $amount % $page_size ){ //取總資料量除以每頁數的餘數
  21. $page_count = (int)($ amount / $page_size) 1; //如果有餘數,則頁數等於總資料量除以每頁數的結果取整再加一
  22. }else{
  23. $page_count = $amount / $page_size; //如果沒有餘數,則頁數等於總資料量除以每頁數的結果
  24. }
  25. }
  26. else{
  27. $page_count = 0;
  28. }
  29. // 翻頁連結
  30. $page_string = '';
  31. if( $page == 1 ){
  32. $page_string .= '第一頁|上一頁|';
  33. }
  34. else{
  35. $page_string .= '|上一頁|';
  36. }
  37. if( ($page == $page_count) || ($page_count == 0) ){
  38. $page_string .= '下一頁|尾頁';
  39. }
  40. else{
  41. $page_string .= '下一頁 a>|尾頁';
  42. }
  43. // 取得數據,以二維數組格式傳回結果
  44. if( $amount ){
  45. $sql = "select * from table order by id desc limit ". ($page-1)*$page_size .", $page_size";
  46. $result = mysql_query($mysql );
  47. while ( $row = mysql_fetch_row($result) ){
  48. $rowset[] = $row;
  49. }
  50. }else{
  51. $rowset = array() ;
  52. }
  53. // 沒有包含顯示結果的程式碼,那不在討論範圍,只要用foreach就可以很簡單的用得到的二維數組來顯示結果
  54. ?>
複製程式碼

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

  1. // filename: pager.class.php
  2. // 分頁類,這個類別只用於處理資料結構,不負責處理顯示的工作
  3. class pager
  4. {
  5. var $pagesize; //每頁的數量
  6. var $currentpageid; //目前的頁數
  7. var $nextpageid; //下一頁
  8. var $previouspageid; //上一頁
  9. var $numpages; //總頁數
  10. var $numitems; //總記錄數
  11. var $isfirstpage; //是否第一頁
  12. var $islastpage; //是否最後一頁
  13. var $sql; //sql查詢語句
  14. function pager($option)
  15. {
  16. global $db;
  17. $this->_setoptions($option);
  18. // 總條數
  19. if ( !isset($this->numitems) )
  20. {
  21. $res = $db-> query($this->sql);
  22. $this->numitems = $res->numrows();
  23. }
  24. // 總頁數
  25. if ( $this->numitems > 0 )
  26. {
  27. if ( $this->numitems pagesize ){ $this->numpages = 1; }
  28. if ( $this->numitems % $this->pagesize )
  29. {
  30. $this->numpages= (int)($this->numitems / $this->pagesize) 1;
  31. }
  32. else
  33. {
  34. $this->numpagess = $this->numitems / $this->pagesize;
  35. }
  36. }
  37. else
  38. {
  39. $this->numpages = 0;
  40. }
  41. switch ( $this->currentpageid )
  42. {
  43. case $this->numpages == 1:
  44. $this->isfirstpage = true;
  45. $this->islastpage = true;
  46. break;
  47. case 1:
  48. $this->isfirstpage = true;
  49. $this->islastpage = false;
  50. break;
  51. case $this->numpages: isfirstpage = false;
  52. $this->islastpage = true;
  53. break;
  54. default:
  55. $this->isfirstpage = false;
  56. $this->islastpage = false; 🎜> }
  57. if ( $this->numpages > 1 )
  58. {
  59. if ( !$this->islastpage ) { $this->nextpageid = $this->currentpageid 1; }
  60. if ( !$this->isfirstpage ) { $this->previouspageid = $this->currentpageid - 1; }
  61. }
  62. return true;
  63. }
  64. > /***
  65. *
  66. * 返回結果集的資料庫連接
  67. * 在結果集比較大的時候可以直接使用這個方法獲得資料庫連接,然後在類別之外遍歷,這樣開銷較小
  68. *如果結果集不是很大,可以直接使用getpagedata的方式來取得二維陣列格式的結果
  69. * getpagedata方法也是呼叫本方法來取得結果的
  70. *
  71. ***/
  72. function getdatalink()
  73. {
  74. if ( $this->numitems )
  75. {
  76. global $db;
  77. {
  78. global $db;
  79. {
  80. global $db;
  81. {
  82. global $db;
  83. {
  84. global $db;
  85. {
  86. global $db; > $pageid = $this->currentpageid;
  87. $from = ($pageid - 1)*$this->pagesize;
  88. $count = $this->pagesize;
  89. $link = $db->limitquery($this->sql, $from, $count); //使用pear db::limitquery方法保證資料庫相容性
  90. return $link;
  91. }
  92. else
  93. {
  94. return false;
  95. }
  96. }
  97. /***
  98. *
  99. * 以二維陣列的格式傳回結果集
  100. *
  101. ***/
  102. function getpagedata()
  103. {
  104. {if ( $this->numitems )
  105. {
  106. if ( $res = $this->getdatalink() )
  107. {
  108. if ( $res->numrows() )
  109. {
  110. while ( $row = $res->fetchrow() )
  111. {
  112. $result[] = $row;
  113. }
  114. }
  115. else
  116. {
  117. $result = array();
  118. }
  119. return $result;
  120. }
  121. else
  122. {
  123. return false;
  124. }
  125. }
  126. else {
  127. return false;
  128. }
  129. }
  130. function _setoptions($option)
  131. {
  132. $allow_options = array($option)
  133. {
  134. $allow_options = array( 'pagesize > 'currentpageid',
  135. 'sql',
  136. 'numitems'
  137. );
  138. foreach ( $option as $key => $value )
{
if ( in_array($key, $allow_options) && ($value != null) ) { $this->$key = $value;
} } return true ; } } ?> 複製程式碼

分頁程式碼呼叫:

  1. // filename: test_pager.php
  2. // 這是一段簡單的範例程式碼,前邊省略了使用pear db類別建立資料庫連線的程式碼
  3. require "pager.class.php";
  4. if ( isset($_get['page']) )
  5. {
  6. $page = (int)$_get[ 'page'];
  7. }
  8. else
  9. {
  10. $page = 1;
  11. }
  12. $sql = "select * from table order by id";
  13. $pager_option = array(
  14. "sql" => $sql,
  15. "pagesize" => 10,
  16. "currentpageid" => $page
  17. );
  18. if ( isset($_get[' numitems']) )
  19. {
  20. $pager_option['numitems'] = (int)$_get['numitems'];
  21. }
  22. $pager = @new pager($pager_option); $data = $pager->getpagedata();
  23. if ( $pager->isfirstpage )
  24. {
  25. $turnover = "首頁|上一頁|";
  26. }
  27. else
  28. {
  29. $turnover = "首頁|previouspageid."&numitems=".$pager->numitems."'>上一頁|";
  30. }
  31. if ( $pager->islastpage )
  32. {
  33. $turnover .= "下一頁|尾頁";
  34. }
  35. else
  36. {
  37. $turnover .= " nextpageid."&numitems=".$pager->numitems."'>下一頁|numpages."&numitems=".$pager-> numitems."'>尾頁";
  38. }
  39. ?>
複製程式碼

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

  1. class memberpager extends pager
  2. {
  3. function showmemberlist()
  4. { 🎜>
  5. $data = $this->getpagedata();
  6. // 顯示結果的程式碼
  7. // ......
  8. }
  9. }
  10. // / 呼叫
  11. if ( isset($_get['page']) )
  12. {
  13. $page = (int)$_get['page'];
  14. }
  15. else
  16. {
  17. $page = 1;
  18. }
  19. $sql = "select * from members order by id";
  20. $pager_option = array(
  21. "sql" => $sql,
  22. "pagesize" => 10,
  23. "currentpageid" => $page
  24. );
  25. if ( isset($_get['numitems']) )
  26. {
  27. $pager_option[' numitems'] = (int)$_get['numitems'];
  28. }
  29. $pager = @new memberpager($pager_option);
  30. $pager->showmemberlist();
  31. ?>
複製程式碼
第二,不同資料庫的相容性,在不同的資料庫裡截獲一段結果的寫法是不一樣的。

  1. $pagenum=@ceil($num/$pagesize);
  2. if($num > $pagesize){
  3. if($pageval if($pageval==$pagenum){
  4. echo "首頁 上一頁 下一頁 末頁";
  5. //echo "第".$pageval."頁/共".$pagenum."頁";
  6. echo " 到第 頁,共$pagenum 頁";
  7. }
  8. }
  9. }
  10. ?>
  • 複製代碼

    陳述:
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn