ページング機能の作成 - PHPプロ!Q&A掲示板

1097

  • 0P

ページング機能の作成

質問日時 / 2008年4月7日 22:49    回答数 / 5件

Questioner:  edokko  このエントリーをはてなブックマークに追加 

キーワード / ページング    表示数   

1ページに9件表示のページング機能をつけたいのですが、
インターネットで色々調べても一向に分かりません。

下記のようなコードだと、

  1. $result = mysql_query("SELECT count(*) as count FROM quotes WHERE active='Yes'");
  2.         
  3. echo count($result);

数字の 1 しか表示されません。

例として、下記のような感じで2種類(#1と#2)のページング機能を作成したいのですが・・。

#1 < 前のページ | Pages 1 of 5 | 次のページ >
説明: 前のページ、次のページのリンクをクリックすると、そのページに移動する。
Pages 1 of 5 は、全体のページ数のどのページを現在表示しているか。
例えば、全体のページ数が6ページで、そのうちの現在2ページ目を表示しているのであれば、
Pages 2 of 6 と表示される。

#2 ページへ移動: 「」(GO ボタン)
説明: 「」はフォームのテキストフィールドで、その中に移動したいページの数字を入力して
GOボタンをクリックすると、そのページへ移動する。


GETを使用するとか、SESSIONを使用するとか、どっちが良いのかも分かりません。

サンプルソースとかありませんか?

DBはMySQLです。

初心者ですみません。
何方か教えて頂けると大変助かります。

宜しく御願いします。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01Kanonbell一歩ずつやっていったほうがいいと思います。 mysq
┃┗A01-1edokkoKanonbellさま、 早速のご意見どうも有難うござい
┗A02signal初心者であることを詫びる必要はありません。 しか
 ┗A02-1edokkosignalさま、 早速のご意見どうも有難うございます
  ┗A02-1-1Kanonbell>実際のページ数以上の数字を入力した時にエラー文を

回答一覧

並び替え:

A01 参考になった
answererKanonbell [4月8日 00:02]

一歩ずつやっていったほうがいいと思います。

mysql_queryは結果そのものを返す訳ではないです。
http://php.benscom.com/manual/ja/function.mysql-query.php
「返り値」の項目を読み、どのように使えばよいのかサンプルソースを実行してみて
感触を掴むとよいでしょう。

ページリンクは、最初はGoogleの検索結果のようなものを、とりあえずGETで作ってみた
方が良いと思います。
最初から目標だけ高い位置にあっても手が届かないだけなので。

・(検索結果などの)全件数を取得する。
・全件数 / 9 してページ数を取得する。(ceilとか使う)
・現在のページ番号をGETで取得。なければ初期値として1とか。
・実際のデータをlimit句を使いつつ取得する。
 1ページ目であればlimit(0,9)になる。これをページ番号で表現できるようにする。
・ページリンクを作成、表示する。
 ここでページ番号をGETで渡せるように工夫する。

考えどころとしてはこの辺かな?
どのような形のページリンクを作るにしろ、内部のロジックはほとんど変わらないので、
どういう動きを実現すればいいかを良く考えて、それぞれをひとつひとつ考えていって
みてはいかがでしょうか。

この意見に回答する

ツリーへ TOPへ

A01-1
replyeredokko [4月10日 00:58]

Kanonbellさま、

早速のご意見どうも有難うございます。
お蔭様で、ページング機能を作ることが出来ました。

また質問するかもしれませんが、その時は又どうぞ宜しく御願いします。

この意見に回答する

ツリーへ TOPへ

A02 参考になった
answerersignal [4月8日 14:52]

初心者であることを詫びる必要はありません。

しかし
「こういうソースを書いたのですが、こういう機能を実装するためには
 どうしたらいいのか」
という質問をしてもらわないと、回答するのが面倒です。

  1. <?php
  2. function get_parameter( $key ) {
  3.   if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) {
  4.     return isset( $_POST[$key] ) ? $_POST[$key] : '';
  5.   } else {
  6.     return isset( $_GET[$key] ) ? $_GET[$key] : '';
  7.   }
  8. }
  9.  
  10. # 1ページ当たり何件表示するか
  11. $perpage = 9;
  12.  
  13. # データベース接続
  14. $conn = mysql_connect( 'host''user''pass' );
  15. mysql_select_db( 'name'$conn );
  16.  
  17. # とりあえず、全件数を取得
  18. $result = mysql_query('SELECT COUNT(*) AS count FROM test');
  19. $temp   = mysql_fetch_array( $result );
  20. $entry  = $temp['count'];
  21.  
  22. # データがあるとき
  23. if ( $entry ) {
  24.  
  25.   # ページ数の計算
  26.   $pages = ceil( $entry / $perpage );
  27.  
  28.   # 表示ページの指定
  29.   $current = intval( get_parameter('p') );
  30.   if ( $current <      1 ) $current = 1;
  31.   if ( $current > $pages ) $current = $pages;
  32.  
  33.   # データベースから表示する部分だけを取得
  34.   $list = array();
  35.   $sql  = sprintf( 'SELECT * FROM test LIMIT %d,%d'( $current - 1 ) * $perpage$perpage );
  36.   $result = mysql_query( $sql );
  37.   while ( $row = mysql_fetch_array( $result ) ) $list[] = $row;
  38.  
  39. }
  40.  
  41. header('Content-Type: text/html; charset=UTF-8');
  42. ?>
  43. <html>
  44. <head>
  45. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  46. <title>ページング機能の作成</title>
  47. </head>
  48. <body>
  49.  
  50. <?php if ( $entry ) { ?>
  51.  
  52. <?php foreach ( $list as $item ) { ?>
  53. <!-- 表示処理 -->
  54. <?php } ?>
  55.  
  56. <!-- #1 -->
  57. <p>
  58. <!-- 表示ページが最初のページのときはリンクを張らない -->
  59. <?php if ( $current - 1 < 1 ) { ?>
  60. <span class="blur">&lt; 前のページ</span>
  61. <?php } else { ?>
  62. <a href="?p=<?php print $current - 1?>">&lt; 前のページ</a>
  63. <?php } ?>
  64.  
  65. | Pages <?php print $current?> / <?php print $pages?> |
  66.  
  67. <!-- 表示ページが最後のページのときはリンクを張らない -->
  68. <?php if ( $current + 1 > $pages ) { ?>
  69. <span class="blur">次のページ &gt;</span>
  70. <?php } else { ?>
  71. <a href="?p=<?php print $current + 1?>">次のページ &gt;</a>
  72. <?php } ?>
  73. </p>
  74.  
  75. <!-- #2 -->
  76. <p>
  77. <form name="page" method="get" action="">
  78. <select name="p" onchange="document.page.submit();">
  79. <?php for ( $i = 1$i <= $pages$i ++ ) { ?>
  80.  
  81. <!-- 表示ページを選択済みにする -->
  82. <?php if ( $i == $current ) { ?>
  83. <option value="<?php print $i?>" selected><?php print $i?></option>
  84. <?php } else { ?>
  85. <option value="<?php print $i?>"><?php print $i?></option>
  86. <?php } ?>
  87. <?php } ?>
  88. </select>
  89. </form>
  90. </p>
  91.  
  92. <?php } else { ?>
  93. <p>no entry</p>
  94. <?php } ?>
  95.  
  96. </body>
  97. </html>

# エディタで見る分には短いくせに、Web上で見ると長いコードに感じる

この意見に回答する

ツリーへ TOPへ

A02-1
replyeredokko [4月10日 01:24]

signalさま、

早速のご意見どうも有難うございます。
お蔭様で、ページング機能を作ることが出来たのですが、
FORMの件で質問があります。


選択タイプの変わりに、テキスト・タイプ 下記のようにすると、
  1. <input type="text" size="5" name="page" value="">

フィールドの中に表示したいページの数字を入力してSUBMITすると
そのページへ移動するというかたちにしたのですが、
ここまでは問題なく出来たのですが、
実際のページ数以上の数字を入力した時にエラー文をポップアップ表示させたいのですが、
無理でしょうか?

例えば、実際1ページしかないのに、フィールドの中に2を入力してSUBMITすると、
エラー文が出てくるという感じです。

お手数をおかけしますが、どうぞ宜しく御願いします。

この意見に回答する

ツリーへ TOPへ

A02-1-1
replyerKanonbell [4月11日 10:20]

>実際のページ数以上の数字を入力した時にエラー文をポップアップ表示させたいのですが、
>無理でしょうか?

できますけど、JavaScriptを使用することになります。

submitボタンにOnClickなどでJavaScriptを呼び出すようにし、入力されたページ番号が
適正かどうかのチェックを行い、適正であればそのままsubmit処理、不正であれば
アラートを出すって仕組みにすればいいでしょう。

このJavaScriptの仕組みをどうやるかは大きく分けて二通りあります。
・静的なJavaScript。適正なページ番号の範囲はあらかじめPHPで記述されるだけ。
・Ajaxを使用。JavaScriptからサーバにアクセスさせ、適正なページ番号かどうかの判定を
 サーバ側で行わせて結果だけもらい、submit処理かアラート処理を行う。
いきなりAjaxやるのは難しいので前者でしょうか。

どちらにしろ、submitされて画面遷移したあとにもページ番号が適正かどうかのチェックは
必要ですけどね。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)