- ベストアンサー
PHP+MySQLで検索結果のページを分割する方法
- 検索結果のページを分割している際に、2ページ目以降に検索されたレコードが表示されない場合の対処方法を教えてください。
- また、「<?= $msg ?>」で検索結果の総数を表示したいのですが、常に「1」としか表示されません。解決策を教えてください。
- PHPとMySQLを使用して、ページング機能を実装していますが、検索結果のページを分割している際に問題が発生しています。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
以前の質問の際に作成したサンプルです. テーブルに id を追加しています。 <?php // DB接続 略 //初期データ $self = basename(__FILE__); $dataRow = 3; $currntPage = 1; $dataHtml = ''; $pagerLink = ''; $message = "データがありません"; //パラメータを取得 $keyword = ( isset($_REQUEST['keyword']) ) ? $_REQUEST['keyword'] : ''; $startWith = isset($_REQUEST['s']) ? $_REQUEST['s'] +0 : 0; //データ件数の取得 $sql = 'SELECT COUNT(id) FROM TABLE1'; if( strlen($keyword) > 0 ) $sql .= sprintf(" WHERE anime LIKE '%%%s%%'", mysql_real_escape_string($keyword )); $dataNum = mysql_result(mysql_query($sql, $conn), 0) +0; if( $dataNum > 0 ) { //メッセージ変更 $message = sprintf('%d件のデータがあります', $dataNum); //データ取得 $sql = 'SELECT * FROM TABLE1'; if( strlen($keyword) > 0 ) $sql .= sprintf(" WHERE anime LIKE '%%%s%%'", mysql_real_escape_string($keyword )); $sql .= ' ORDER BY age, id ' .sprintf("LIMIT %d, %d", $startWith, $dataRow); if($results = mysql_query($sql,$conn)) { $dataHtml .= '<table>'; while($row = mysql_fetch_array($results)) $dataHtml .= sprintf('<tr><td>%d</td><td>%s</td><td>%s</td><td>%d</td></tr>'.PHP_EOL, $row['id'], $row['name'], $row['anime'], $row['age']); $dataHtml .= '</table>'; mysql_free_result($results); } else die("データの取得に失敗しました"); //ページャ作成 $pageNum = ( ( $dataNum % $dataRow ) > 0 ) ? intval($dataNum / $dataRow ) + 1: intval( $dataNum / $dataRow ); for($p=1; $p <= $pageNum; $p++) { $nextWith = $dataRow * ($p -1); if( $nextWith == $startWith ) { $pagerLink .= sprintf('%d'.PHP_EOL, $p); $currntPage = $p; } else $pagerLink .= sprintf('<a href=%s?keyword=%s&s=%d>%d</a>'.PHP_EOL, $self, $keyword, $nextWith, $p); } $pagerLink .= sprintf(' [%d/%dページ]', $currntPage, $pageNum ); } mysql_close($conn); ?><html> <body> <form method="post"> <input type="text" name="keyword" value="<?php echo $keyword ?>"/> <input type="hidden" name="s" value="0" /> <input type="submit" /> </form> <?php echo $message .PHP_EOL; echo $dataHtml.PHP_EOL; echo $pagerLink.PHP_EOL; ?> </body> </html>
その他の回答 (5)
- NARH
- ベストアンサー率82% (88/107)
> ついでの質問で申し訳ないです。 > > また別にはなるのですが、フリーワードとインプットやセレクトを一緒に使おうとすると、すべてパラメータで処理になるということで良いのでしょうか? >(まだまだ先なのですが、テーブルの選択も考えておりまして) 質問の意図が読み取りづらいです。 HTML上で表現された項目は、GETかPOST(もしくは Cookie)になりますが、そういった事以外の何かを考えてらっしゃるのでしょうか? 入力された値を持ちまわり方ということでしたら - 毎回パラメータで取得する - パラメータをCookie に格納する - 一度パラメータで取得しセッションに格納する のような方式が考えられますが、いつから~いつまで持ちまわるのかライフサイクルを決めて、実装する必要があります。 テーブルの選択ということは、検索対象ごとにテーブルを持つ方法を検討されているのでしょうか? 例えば、カテゴリマスターテーブル(カテゴリID, カテゴリ名), とデーターテーブル(ID, カテゴリID, データ)のようなテーブル設計ですと、2つのテーブルで沢山のカテゴリ分類が可能になりますし、参照するテーブル名も一定しています。ちがうのは WHERE句のカテゴリIDだけですから、これだけパラメータで取得すれば良い事になります。 具体的な状況になってから別途質問を起こされたほうが、明確な回答が得られるかと思います。
お礼
ごめんなさい、いろいろ考えていたらぽろぽろと疑問が出てきておりました。 ページング(?)のない状態での検索はできたのですがページングがわからない状態だったので、今回質問させていただいたので・・・すみません、よくばり過ぎてました・・・。 この先はまたやりたいことを明確にして、わからないことがあれば質問させていただきたいと思いますっ!! ありがとうございました!!
- NARH
- ベストアンサー率82% (88/107)
SELECT COUNT(id) FROM TABLE1 このクエリーが流れますか? 確認してみてください。(FALSEになっている気がします) 環境によって、テーブル名など大文字小文字を判別する場合、しない場合があるので注意する必要があります。
お礼
すみません、原因わかりました!! $conn(←変数…であってるのでしょうか)の設定をしてなかったようです!! 凡ミスです、すみません。 本当にご丁寧な回答いただいて、かなり勉強させていただきました!! ありがとうございました!!
補足
ついでの質問で申し訳ないです。 また別にはなるのですが、フリーワードとインプットやセレクトを一緒に使おうとすると、すべてパラメータで処理になるということで良いのでしょうか? (まだまだ先なのですが、テーブルの選択も考えておりまして)
- NARH
- ベストアンサー率82% (88/107)
うぅっ。 読み返すと、変なトコがボロボロと。 - form タグに action が指定されていないので、ページングしてから再検索したときURLが変だ。 - if($results = mysql_query($sql,$conn)) の if ブロック $results = @mysql_query($sql,$conn) or die("データの取得に失敗しました"); と書きたかったんだと思われます。 あんまりイケてないですね。
お礼
ありがとうございました!!
補足
-formタグに・・・ <form method="post" action="sample.php">としました - if($results¥・・・ if($results = mysql_query($sql,$conn)) { $dataHtml.= '<table>'; while($row = mysql_fetch_array($results)) $dataHtml.= sprintf('<tr><td>%d</td><td>%s</td><td>%s</td><td>%d</td></tr>'.PHP_EOL, $row['id'], $row['name'], $row['anime'], $row['age']); $dataHtml.= '</table>'; mysql_free_result($results); }else{ print "データの取得に失敗しました"; } としてみたのですが・・・良かったのでしょうか・・・? 今ページの方で、「データがありません」と表示される状態です。 度々申し訳ないのですが、ご指摘いただけたらと思います。
- NARH
- ベストアンサー率82% (88/107)
↓の回答ですが、ページ番号ではなく、offset 値を直接渡しています。 #後なんか bug があった気がするんですが、ちょっと思い出せません。 適当なファイル名(pagingSample.phpとか) に保存してアクセスしてください。 テーブルは以下のようにしたらしいです。 CREATE TABLE TABLE1 ( id int AUTO_INCREMENT PRIMARY KEY, name varchar(256) NOT NULL, anime varchar(256) NOT NULL, age int ) ENGINE=InnoDB CHARSET=utf8; 以前の質問に id を追加しただけだと思います。 ノリで30分ぐらいで書いたソースなので、もう少し効率的に書けそうですが、参考にしてみてください。
お礼
ありがとうございました!!
補足
さらについでで申し訳ないのですが・・・ この場合の $self= basename(__FILE__); 「__FILE__」には作ったPHPのファイル名を置き換えるということで良いのでしょうか?
- tany180sx
- ベストアンサー率63% (239/379)
$_POSTはPOSTで送信した値しか入りません。 検索条件をページネーションに組み込んでGETで遷移させたり セッション変数に格納しておくなどの対応が必要です。 mysql_num_rowsは数値を返すので さらにcount( )する必要はありません。
お礼
ご指摘ありがとうございます!! >>セッション変数 勉強します!!
お礼
前回に続き、お世話になっております・・・!! 初心者ながらもニュアンス(?)は少しずつ理解してきているのですが、やはり1つ1つの理解には至っておらず… サンプルまで組んでいただいて、かなり勉強させていただいていますっ!! ご回答ありがとうございます!!