ホームページ  >  記事  >  バックエンド開発  >  PHPのページング原理とページジャンプの例

PHPのページング原理とページジャンプの例

WBOY
WBOYオリジナル
2016-07-25 08:52:461553ブラウズ
  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 番目から 20 番目records 30 records
  4. ...
コードをコピー

この SQL ステートメントのセットは、実際には、$pagesize=10 の場合にテーブル内のデータの各ページをフェッチするための SQL ステートメントです。このようなテンプレートを要約できます。 select * テーブル制限から ($currentpageid - 1) * $pagesize, $pagesize このテンプレートを使用し、対応する値を上記の一連の SQL ステートメントに代入して、そのとおりであるかどうかを確認してください。データを取得する方法という最も重要な問題を解決したら、あとはパラメータを渡し、適切な SQL ステートメントを作成し、PHP を使用してデータベースからデータを取得して表示するだけです。

phpページングコード:

  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. $page = 1; }
  9. // ページごとのページ数
  10. $pagesize = 10;
  11. // データの総量を取得します
  12. $sql = "select count(*) as amount from table";
  13. $result = mysql_query($sql);
  14. $row = mysql_fetch_row ($result);
  15. $amount = $row['amount'];
  16. // 合計ページ数を計算します
  17. if( $amount ){
  18. if( $amount < $page_size ) { $page_count = 1; } //総データ量が $pagesize 未満の場合、ページは 1 つだけです
  19. if( $amount % $page_size ){ //総データ量をページ数で割った余りPages
  20. $page_count = (int)($amount / $page_size ) + 1; //余りがある場合、ページ数は総データ量をページ数で割って切り上げて 1 を加えたものになります
  21. }else{
  22. $page_count = $amount / $page_size; //余りがない場合、ページ数はデータの総量をページごとのページ数で割ったものとなります
  23. }
  24. }
  25. else{
  26. $page_count = 0;
  27. }
  28. // ページめくりリンク
  29. $page_string = '';
  30. if( $page == 1 ){
  31. $page_string .= '最初のページ|前のページ|';
  32. $page_string .= '前のページ|';
  33. }
  34. if( ($page == $page_count) | | ($page_count == 0) ){
  35. $page_string .= '次のページ|最後のページ'
  36. else {
  37. $page_string .= '次のページ|最後のページ';
  38. }
  39. // データを取得し、結果を 2 次元配列形式で返します
  40. if( $amount ){
  41. $sql = "select * from table order by id desc 制限 ". ($page-1)*$page_size .", $page_size";
  42. $result = mysql_query($sql);
  43. while ( $row = mysql_fetch_row($result) ){
  44. $rowset[] = $row;
  45. }
  46. }else{
  47. $rowset = array();
  48. }
  49. / / 結果を表示するコードはないため、foreach を使用する限り、それは可能です。取得した 2 次元配列を簡単に使用して結果を表示します
  50. コードをコピーします
  51. oo スタイルのコード。次のコードのデータベース接続は、pear db クラスを使用して処理されます。

    1. // ファイル名: pager.class.php
    2. // ページング クラス、このクラスはデータ構造の処理にのみ使用され、表示作業の処理には関与しません
    3. class pager
    4. {
    5. var $pagesize ; //各ページの番号
    6. var $currentpageid; //次のページ
    7. var $numpages; //ページの総数$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. if ( $this->numitems > ; 0 )
    21. {
    22. if ( $this->numitems < $this->pagesize ){ $this->numpages = 1; }
    23. if ( $this->numitems % $this->pagesize )
    24. {
    25. $this->numpages= (int)($this->numitems / $this->pagesize) + 1;
    26. }
    27. else
    28. {
    29. $this->numpages = $this-> ;numitems / $this->pagesize;
    30. }
    31. }
    32. else
    33. {
    34. $this->numpages = 0;
    35. }
    36. switch ( $this->currentpageid )
    37. {
    38. case $this-> numpages == 1:
    39. $this->isfirstpage = true;
    40. ケース 1:
    41. $this->isfirstpage = true; false;
    42. ブレーク;
    43. $this->numpages:
    44. $this->islastpage = true;
    45. $this->isfirstpage = false;
    46. $this->islastpage = false; }
    47. if ( $this->numpages > 1 )
    48. {
    49. if ( !$this->islastpage ) { $this->nextpageid = $this- >currentpageid + 1; }
    50. if ( !$this->isfirstpage ) { $this->previouspageid = $this->currentpageid - 1; }
    51. return true; *
    52. *
    53. * 結果セットのデータベース接続を返します
    54. * 結果セットが比較的大きい場合は、このメソッドを直接使用してデータベース接続を取得し、クラスの外側をトラバースすることでオーバーヘッドが少なくなります
    55. *結果セットはそれほど大きくないため、getpagedata を直接使用して 2 次元配列形式で結果を取得できます
    56. * getpagedata メソッドもこのメソッドを呼び出して結果を取得します
    57. *
    58. ***/
    59. function getdatalink()
    60. {
    61. if ( $this->numitems )
    62. {
    63. グローバル $db;
    64. $pageid = $this->currentpageid;
    65. $from = ($pageid; - 1)*$this->pagesize;
    66. $count = $this->pagesize;
    67. $link = $db->limitquery($this->sql, $from, $count); pear db::limitquery メソッドでデータベースの互換性を確保します
    68. return $link;
    69. }
    70. else
    71. {
    72. return false; }
    73. }
    74. /***
    75. *
    76. * 結果セットを 2 次元配列の形式で返します
    77. *
    78. ***/
    79. function getpagedata()
    80. {
    81. if ( $this->numitems )
    82. {
    83. if ( $res = $this->getdatalink() )
    84. {
    85. if ( $res->numrows() )
    86. {
    87. while ( $row = $res- >fetchrow() )
    88. {
    89. $result[] = $row; }
    90. }
    91. else
    92. {
    93. $result = array() }
    94. else
    95. {
    96. return false; ;
    97. }
    98. }
    99. else
    100. {
    101. return false;
    102. }
    103. function _setoptions($option)
    104. {
    105. $allow_options = array(
    106. 'pagesize',
    107. 'currentpageid',
    108. 'SQL'、
    109. ' numitems'
    110. );
    111. foreach ( $option as $key => $value )
    112. {
    113. if ( in_array($key, $allow_options) && ($value != null) )
    114. {
    115. $this-> $key = $value;
    116. }
    117. }
    118. true を返す
    119. }
    120. }
    121. コードをコピーします。

      ページネーションコード呼び出し:

      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. else
      34. {
      35. $turnover .= "nextpageid."&numitems=".$pager->numitems."'>次のページnumpages."&numitems=".$pager->numitems."'>最後のページ
      36. }
      37. ?> ;
      38. コードをコピー
      手順: このクラスはデータを処理するだけで、表示は行いません。データ処理と結果表示の両方を 1 つのクラスに入れるのは少し抵抗があるからです。 表示時の状況や要件は変更可能です。たとえば、ページネーションを表示するには、ページャー クラスをベースに独自のサブクラスを継承して処理するのがよいでしょう。ユーザーのページネーション リスト:

      class memberpager extends pager
        {
      1. function showmemberlist()
      2. {
      3. global $db;
      4. $data = $this->getpagedata()
      5. // 結果を表示するコード
      6. // ......
      7. }
      8. }
      9. ///
      10. if ( isset($_get['page']) ) を呼び出します
      11. {
      12. $page = (int)$_get['page']; }
      13. else
      14. {
      15. $page = 1;
      16. }
      17. $sql = "メンバーから ID 順に選択";
      18. $pager_option = array(
      19. "sql" => $sql,
      20. "pagesize" => 10,
      21. "currentpageid" => $page
      22. );
      23. if (isset($_get['numitems']) )
      24. {
      25. $pager_option['numitems'] = (int)$_get['numitems'];
      26. $pager = @new memberpager($pager_option);
      27. $pager->showmemberlist();
      28. ?>
      29. コードをコピー
      30. 2 番目に、異なるデータベースの互換性インターセプト結果のセクションが異なります。

    $pagenum=@ceil($num/$pagesize){

    if($ pageval<=1) $pageval=1;
    if($pageval==$pagenum){
      echo "ホームページ 前のページa href='$ url?page=".$pagenum."'>最後のページ";

    1. //echo "page".$pageval."/total".$pagenum."page" ;
    2. echo " to < select name='toppage' size='1' onchange='window.location="$url?page="+this.value'>n";
    3. for ($i = 1 ; $i if ($i == $pageval)
    4. echo "n";
    5. else
    6. echo "n";
    7. }
    8. echo " $pagenum ページ中";
    9. }
    10. }
    11. }
    12. ?>
  52. コピーコード
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。