ホームページ  >  記事  >  バックエンド開発  >  PHP ページネーション コードの詳細な説明 (例付き)

PHP ページネーション コードの詳細な説明 (例付き)

WBOY
WBOYオリジナル
2016-07-25 08:52:242322ブラウズ
  1. // データベース接続を確立します

  2. $link = mysql_connect("localhost", "mysql_user", "mysql_passWord")
  3. or die("接続できませんでした: " . 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 < ; $page_size ){ $page_count = 1; } // 合計データ量が $PageSize 未満の場合、ページは 1 つだけです
  21. if( $amount % $page_size ){ // 合計データ量の残りを取ります1ページあたりのページ数で割ったもの
  22. $page_count = (int)($ amount / $page_size) + 1 //余りがある場合、ページ数は総データ量をページ数で割った値となります。切り上げて 1 を加えます
  23. }else{
  24. $page_count = $amount / $page_size; //If 余りがない場合、ページ数は合計データ量を各ページの数で割った値になります
  25. }
  26. }
  27. else{
  28. $page_count = 0;
  29. }
  30. // ページめくりリンク
  31. $page_string = '';
  32. if( $page == 1 ){
  33. $page_string .= '最初のページ|前のページ|';
  34. }
  35. else{
  36. $page_string .= '最初のページ |前のページ< /a>|';
  37. }
  38. if( ($page == $page_count) || ($page_count == 0) ){
  39. $page_string .= '次のページ|最後のページ';
  40. }
  41. else{
  42. $ page_string .= '|最後のページ< /a>';
  43. }
  44. // データを取得し、結果を 2 次元配列形式で返します
  45. if( $amount ){
  46. $sql = "select * from table order by id desc limit ($page-1 ". )*$page_size .", $page_size";
  47. $result = mysql_query($sql);< ;/p>
  48. while ( $row = mysql_fetch_row($result) ){

  49. $rowset[] = $ row;
  50. }
  51. }else{
  52. $rowset = array();
  53. }
  54. // なし 結果を表示するためのコードが含まれていますが、これについては説明の範囲を超えています。foreach を使用する限り、簡単に表示できます。取得した二次元配列で結果を表示します
  55. ?>

コードをコピーします

4. OOスタイルコード データベース接続は、pear db クラスを使用して処理されます。

  1. // FileName: Pager.class.php

  2. // ページング クラス、このクラスはデータ構造の処理にのみ使用され、表示の処理には関与しません
  3. Class Pager
  4. {
  5. var $PageSize; // 各ページの番号
  6. var $NextPageID; // 次のページ
  7. var $numPages;ページ
  8. var $numItems; // レコードの総数
  9. var $isFirstPage; // 最初のページかどうか
  10. var $sql; // p>
  11. < p> function Pager($option)
  12. {
  13. global $db;
  14. $this->_setOptions($option);
  15. // アイテムの総数
  16. if ( !isset($this-> numItems) )
  17. {
  18. $res = $db->query($this->sql);
  19. $this->numItems = $res->numRows();
  20. }
  21. // 総ページ数
  22. if ( $this->numItems > 0 )
  23. {
  24. if ( $this->numItems < $this->PageSize ){ $this->numPages = 1; >numItems % $this- >PageSize )
  25. {
  26. $this->numPages= (int)($this->numItems / $this->PageSize) + 1;
  27. }
  28. else
  29. {
  30. $ this->numPages = $ this->numItems / $this->PageSize;
  31. }
  32. }
  33. else
  34. {
  35. $this->numPages = 0;
  36. }

  37. switch ( $this->gt; CurrentPageID )

  38. {
  39. case $this->numPages == 1:
  40. $this->isFirstPage = true;
  41. $this->isLastPage = true;
  42. Break;
  43. case 1:
  44. $this->isFirstPage = true;
  45. $this->isLastPage = false;
  46. Break;
  47. case $this->numPages:
  48. $this->isFirstPage = false;
  49. $this->isLastPage = true;
  50. Break;
  51. デフォルト :
  52. $this->isFirstPage = false;
  53. $this->isLastPage = false;
  54. }

  55. if ( $this->numPages > 1 )

  56. {
  57. if ( !$this->isLastPage ) { $this->NextPageID = $this->CurrentPageID + 1; }
  58. if ( !$this->isFirstPage ) { $this->前のページID = $this-> }
  59. }

  60. }

  61. p>

  62. function getDataLink()

  63. {
  64. if ( $this->numItems )
  65. {
  66. global $db;

  67. $PageID = $this->CurrentPageID;

  68. < ;p> $from = ($PageID - 1)*$this->PageSize;
  69. $count = $this->PageSize;
  70. $link = $db->limitQuery($ this->sql, $ from, $count); //Pear DB::limitQuery メソッドを使用してデータベースの互換性を確保します

  71. return $link;

  72. }
  73. else
  74. {
  75. return false;
  76. }
  77. }
  78. /***

  79. *
  80. * 結果セットのデータベース接続を返します
  81. * 結果セットが比較的大きい場合、このメソッドを直接使用してデータベース接続を取得し、クラスの外をトラバースできるため、オーバーヘッドが小さくなります
  82. *結果セットはそれほど大きくないため、getPageData を直接使用して 2 次元配列形式で結果を取得できます
  83. * getPageData メソッドもこのメソッドを呼び出して結果を取得します
  84. *
  85. ***/

  86. 関数 getPageData()

  87. {
  88. if ( $this->numItems )
  89. if ( $res = $ this->getDataLink() )
  90. {
  91. if ( $res->numRows() )
  92. {
  93. while ( $row = $res->fetchRow() )
  94. {
  95. $ result[] = $row; }
  96. }
  97. else
  98. {
  99. $result = array();
  100. }

  101. return $result;

  102. }
  103. else
  104. {
  105. return false;
  106. }
  107. }
  108. else
  109. {
  110. return false;
  111. }
  112. }

  113. function _setOptions($option)

  114. {
  115. $allow_options = array(
  116. 'PageSize',
  117. 'CurrentPageID',
  118. 'sql',
  119. 'numItems '
  120. );

  121. foreach ( $option as $key => $value )

  122. {
  123. if ( in_array($key, $allow_options) && ($ value != null) )
  124. {
  125. $this->$key = $value;
  126. }
  127. }

  128. return true;

  129. }
  130. }
  131. ?>

  132. 呼び出し例:

  133. // FileName: test_pager.php
  134. // pear dbクラスを使用してデータベース接続を確立するコードは省略しています
  135. require "Pager .class.php";
  136. if ( isset($_GET['page']) )
  137. {
  138. $page = (int)$_GET['page'];
  139. }
  140. else
  141. {
  142. $page = 1;
  143. }
  144. $sql = "select * from table order by id";
  145. $pager_option = array(
  146. "sql" => $sql,
  147. "PageSize" => 10,
  148. "CurrentPageID" => $page
  149. );
  150. if ( isset($_GET['numItems']) )
  151. {
  152. $pager_option['numItems'] = (int)$_GET['numItems'];
  153. }
  154. $pager = @new Pager ($pager_option );
  155. $data = $pager->getPageData();
  156. if ( $pager->isFirstPage )
  157. {
  158. $turnover = "ホームページ|前のページ|";
  159. }
  160. else
  161. $売上高 = "ホームページ|前のページ|";
  162. }
  163. if ( $pager->isLastPage )
  164. {
  165. $turnover .= "次のページ |最後のpage";
  166. }
  167. else
  168. {
  169. $turnover .= "|最後のページ}
  170. ?>

コードをコピー
して 2 つの点を説明します。 データ処理と結果表示を 1 つのクラスにまとめるのは少し抵抗があると思うので、このクラスはデータを処理するだけで表示は担当しません。 表示する場合、状況や要件が変更可能であるため、Pager クラスをベースにして独自のサブクラスを継承して、別のページネーションを表示することをお勧めします。ユーザーページネーションリスト:

  1. Class MemberPager extends Pager
  2. {
  3. function showMemberList()
  4. {
  5. global $db;

  6. $data = $this- >getPageData();

  7. // 結果を表示するコード
  8. // ......
  9. }
  10. }
  11. ///
  12. if ( isset($_GET['page']) )
  13. {
  14. $page を呼び出す= (int)$_GET['page'];
  15. }
  16. else
  17. {
  18. $page = 1;
  19. }
  20. $sql = "ID 順にメンバーから選択"
  21. $pager_option = array(
  22. "sql"; => $sql,
  23. "ページサイズ" => 10,
  24. "現在のページID" =>
  25. if ($_GET['numItems'])
  26. $pager_option['numItems' ] = (int)$_GET['numItems'];
  27. }
  28. $pager = @new MemberPager($pager_option);
  29. $pager->showMemberList();
  30. ?>

  31. コードをコピーします
注: 異なるデータベースの互換性のため、異なるデータベースで結果のセクションを書き込む方法は異なります。 mysql: テーブル制限オフセット、行から * を選択します pgsql: select * from tablelimit m offset n ... そのため、クラス内で結果を取得する場合は、pear dbクラスのlimitQueryメソッドを使用する必要があります。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。