ホームページ  >  記事  >  バックエンド開発  >  PHP ページング原理のサンプル分析、PHP oop スタイルのページング コード

PHP ページング原理のサンプル分析、PHP oop スタイルのページング コード

WBOY
WBOYオリジナル
2016-07-25 08:52:511343ブラウズ
  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 .= '|前のページ|';
  37. }
  38. if( ($page == $page_count) || ($page_count == 0) ){
  39. $page_string . = '次のページ|最後のページ';
  40. }
  41. else{
  42. $page_string .= '次のページ| 最後のページ ';
  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);
  48. while ( $row = mysql_fetch_row($result) ){
  49. $rowset[] = $row;
  50. }
  51. }else{
  52. $rowset = array();
  53. }
  54. // 結果を表示するコードは含まれていないので、 foreach を使用する限り、取得した 2 次元配列を使用して結果を表示することが簡単にできます
コードをコピーします

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

  1. // FileName: Pager.class.php
  2. // ページング クラス、このクラスはデータ構造を処理するためにのみ使用され、表示作業の処理には関与しません
  3. Class Pager
  4. {
  5. var $PageSize ; //各ページの数
  6. var $CurrentPageID; //次のページ
  7. var $numPages; var $numItems; //レコードの総数
  8. var $isFirstPage // 最初のページかどうか
  9. var $sql; // SQLクエリ文
  10. function Pager; ($option)
  11. {
  12. global $db;
  13. $this->_setOptions($option);
  14. // アイテムの総数
  15. if ( !isset($this->numItems) )
  16. {
  17. $res = $db->query( $this->sql);
  18. $this->numItems = $res->numRows();
  19. }
  20. // 総ページ数
  21. if ( $this->numItems > 0 )
  22. {
  23. if ( $this->numItems < $this->PageSize ){ $this->numPages = 1; }
  24. if ( $this->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->CurrentPageID )
  38. {
  39. case $this-> ;numPages == 1:
  40. $ this->isFirstPage = true;
  41. $this->isLastPage = true;
  42. ブレーク;
  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 ->現在のページID + 1; }
  58. if ( !$this->isFirstPage ) { $this->前のページID = $this->現在のページID - 1; }
  59. }
  60. return true;
  61. }
  62. /* **
  63. *
  64. * 結果セットのデータベース接続を返します
  65. * 結果セットが比較的大きい場合、このメソッドを直接使用してデータベース接続を取得し、クラスの外をトラバースできるため、オーバーヘッドが小さくなります
  66. *結果セットはそれほど大きくないため、getPageData を直接使用して 2 次元配列形式で結果を取得できます
  67. * getPageData メソッドもこのメソッドを呼び出して結果を取得します
  68. *
  69. ***/
  70. function getDataLink()
  71. {
  72. if ( $this->numItems )
  73. {
  74. global $db;
  75. $PageID = $this->CurrentPageID;
  76. $from = ($ページ ID - 1)*$this->PageSize;
  77. $count = $this->PageSize;
  78. $link = $db->limitQuery($this->sql, $from, $count); // Pear DB::limitQuery メソッドを使用してデータベースの互換性を確保します
  79. return $link;
  80. }
  81. else
  82. {
  83. return false;
  84. }
  85. }
  86. /***
  87. *
  88. * 結果セットを 2 次元配列の形式で返します
  89. *
  90. ***/
  91. function getPageData()
  92. {
  93. if ( $this->numItems )
  94. {
  95. if ( $res = $this->getDataLink() )
  96. {
  97. if ( $res->numRows() )
  98. {
  99. while ( $row = $res ->fetchRow() )
  100. {
  101. $result[] = $row;
  102. }
  103. }
  104. else
  105. {
  106. $result = array();
  107. }
  108. return $result;
  109. }
  110. else
  111. {
  112. return false;
  113. }
  114. }
  115. else
  116. {
  117. return false;
  118. }
  119. }
  120. function _setOptions($option)
  121. {
  122. $allow_options = array(
  123. 'PageSize',
  124. 'CurrentPageID',
  125. 'sql',
  126. 'numItems'
  127. );
  128. foreach ( $option as $key => $value )
  129. {
  130. if ( in_array($key, $allow_options) && ($value != null) )
  131. {
  132. $this-> ;$key = $value;
  133. }
  134. }
  135. return true;
  136. }
  137. }
  138. ?>
  139. コードをコピー

2. PHP ページング コードをテストする

  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. ); if ( isset($_GET['numItems']) )
  18. {
  19. $pager_option['numItems'] = (int)$_GET['numItems'];
  20. }
  21. $pager = @new Pager($pager_option); $data = $pager->getPageData();
  22. if ( $pager->isFirstPage )
  23. {
  24. $turnover = "ホームページ|前のページ|";
  25. }
  26. else
  27. {
  28. $turnover = "ホームページ|PreviousPageID."&numItems= .$pager->numItems."'>前のページ|";
  29. }
  30. if ( $pager->isLastPage )
  31. {
  32. $turnover .= "次のページ|最後のページ" ;
  33. }
  34. else
  35. {
  36. $turnover .= "NextPageID."&numItems=".$pager->numItems."'>次のページnumPages."&numItems=".$pager->numItems."'>最後のページ" ;
  37. }
  38. ?> ;
コードをコピー
手順: データ処理と結果表示の両方を 1 つのクラスに入れるのは少し抵抗があるため、このクラスはデータを処理するだけで表示は担当しません。 表示状況や要件は変更可能です。この Pager クラスでは、独自のサブクラスを継承して、ユーザーのページネーションのリストを表示することができます。

    Class MemberPager extends Pager
  1. {
  2. function showMemberList()
  3. {
  4. global $db;
  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 = "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. ?>
コードをコピー
異なるデータベースでの 2 番目の異なるデータベースの互換性傍受された結果のセクションが異なります。
mysql: テーブル制限オフセット、行から * を選択します pgsql: select * from tablelimit m offset n ...

クラス内で結果を取得する場合は、pear dbクラスのlimitQueryメソッドを使用する必要があります。

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