- ベストアンサー
検索表示について
はじめまして、こんばんは。 HTMLもままならないPHP初心者ですが、ここ2ヶ月、3冊の本を購入し、実際に動作させながら学んでいる状況です。 さて、今回質問させて頂きますのも、DBからPHPにより検索結果を表示させた際、検索にヒットした全ての一覧を1ページ10件ずつ掲載するようなページを、要はここ「教えてGoo!」のように、検索結果を10件ずつ表示させ、ページの下に[1|2|3|...]のようにページ移動のリンクを持つページを作りたいと考えております。 こちらの過去ログにも同じような質問があり、また、他のサイトでも近い内容のものは全てプリントアウトし、一日中資料と睨めっこしておりますが、どれも上手くいかずに困り果てております。。 勿論、丸投げでお願いするつもりはないのですが、皆様のお知恵をお借りできればと質問させて頂きました。 可笑しなところも含め、ご指導いただければ幸いです。宜しくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ID入力:<input type=\"text\" name=\"category\" value=\"$category\" size=\"40\"> 見た所、こんな行があります。 しかし、ページ番号のURLにはパラメータ「category」がありません。 きっと検索1ページのURLには~.php?category=xxxってなってると思います。 2ページ目はcategoryがありませんから、SQLで抽出されてません。 という事で、 print('<a href="'.$_SERVER['PHP_SELF'].'?page='.$i.'">'.$i.'</a>'); を print('<a href="'.$_SERVER['PHP_SELF'].'?page='.$i.'&category='.$category.'">'.$i.'</a>'); に変更。 これでどうでしょうか?
その他の回答 (3)
- めとろいと(@naktak)
- ベストアンサー率36% (785/2139)
失礼、mysql_num_rowsなんてあるんでしたね。 <?php //表示行数 define(_DISPROW_, 10); //DB接続 $con = mysql_connect("host", "user", "pass"); mysql_select_db("database", $con); //対象レコードとページ数の取得 $sql = "SELECT id FROM table ORDER BY id"; $qry = mysql_query($sql); $allrow = mysql_num_rows($qry); $pagecnt = ceil($allrow / _DISPROW_); if ($allrow == 0) { print <<< nodata <table> <tr><td>掲載はありません</td></tr> </table> nodata; mysql_close(); exit; } else { print <<< rows 掲載数{$allrow}件 rows; //表示ページのデータを表示 mysql_data_seek($qry, isset($_GET["page"])?($_GET["page"] - 1) * _DISPROW_:0); echo "<table>"; $i = 0; while($row = mysql_fetch_array($qry)){ if ($i == _DISPROW_) break; print <<< data <tr> <td><a href="../member.php?id={$row['id']}">{$row['id']}</a></td> </tr> data; $i++; } echo "</table>"; } mysql_close(); //ページ番号リンクを生成 for ($i = 1; $i <= $pagecnt; $i++) { print('<a href="'.$_SERVER['PHP_SELF'].'?page='.$i.'">'.$i.'</a>'); $i <> $pagecnt?print(" | "):""; } ?> プログラムって書き方、ほんと色々ありますねぇ。 なんか痛感しました(笑)
補足
naktakさま おはよう御座います。お返事遅れて申し訳ありません。あれからnakutak様からご教授いただいたスクリプトを実行し、感激しつつ、その後試行錯誤を繰り返していた次第です。以下、そのスクリプトなのです。 説明が足りなかったのか、実は今回の内容と申しますのも、あるHTMLページに貼ってあるリンクから移動すると、本PHPファイルに移動し、検索一覧が表示されている…などといった内容のものを考えているのですが、浅はかな考えなのか、本ファイルにある検索フォームで検索後(GETにて渡された)のURLを、最初のHTMLに<a href~>として、貼り付けていた次第です。 以上のことから、検索フォームにて検索した検索結果を見ると、最初の1ページは表示されるのですが(該当ファイル数は検索されているが)、2ページ目以降が「掲載はありません」といった結果となってしまいます。 あれから試行錯誤を繰り返してはいるものの、思うような結果を得ることが出来ずに居ます。 お手数おかけ致しますが、引き続きアドバイス頂ければ幸いです。宜しくお願い致します。 <?php extract($_GET); echo " <br> <p>完全一致のIDを検索</p> <form action=\"test.php\" method=\"get\" > <p>ID入力:<input type=\"text\" name=\"category\" value=\"$category\" size=\"40\"></p> <p><input type=\"hidden\"name=\"page_num\"value=\"0\"> <input type=\"submit\" value=\"検索\"> <input type=\"reset\" value=\"リセット\"></p> </form> "; //表示行数 define(_DISPROW_, 10); //DB接続 $con = mysql_connect("localhost", "root", "3lc4dp4hf1"); mysql_select_db("business", $con); //対象レコードとページ数の取得 $sql= "select * from buyer where category like '$category' order by tourokubi desc"; $qry = mysql_query($sql); $allrow = mysql_num_rows($qry); $pagecnt = ceil($allrow / _DISPROW_); if ($allrow == 0) { print <<< nodata <table> <tr><td>掲載はありません</td></tr> </table> nodata; mysql_close(); exit; } else { print <<< rows 掲載数{$allrow}件 rows; //表示ページのデータを表示 mysql_data_seek($qry, isset($_GET["page"])?($_GET["page"] - 1) * _DISPROW_:0); echo "<table>"; $i = 0; while($row = mysql_fetch_array($qry)){ if ($i == _DISPROW_) break; print <<< data <tr> <td><a href="../member.php?renban={$row['renban']}">{$row['renban']}</a></td> </tr> data; $i++; } echo "</table>"; } mysql_close(); //ページ番号リンクを生成 for ($i = 1; $i <= $pagecnt; $i++) { print('<a href="'.$_SERVER['PHP_SELF'].'?page='.$i.'">'.$i.'</a>'); $i <> $pagecnt?print(" | "):""; } ?>
- めとろいと(@naktak)
- ベストアンサー率36% (785/2139)
1.対象レコードの件数取得SQLを投げる。 2.1.÷10よりページ数を算出する。 3.SQLを投げる。 MySQLの場合はSQL文の最後にLIMIT $x, 10とする。 $xは表示ページ番号×10。 こんなのでいいと思います。 <?php //表示行数 define(_DISPROW_, 10); //DB接続 $con = mysql_connect("localhost", "root", "root"); mysql_select_db("xoops", $con); //対象件数よりページ数を取得 $sql = "SELECT COUNT(*) FROM xoops_tplsource"; $qry = mysql_query($sql, $con); $allrow = mysql_result($qry, 0); $pagecnt = ceil($allrow / _DISPROW_); //表示ページ番号のレコードを表示 $reccnt = isset($_GET['page'])?($_GET['page'] - 1) * 10:0; $sql = "SELECT tpl_id FROM xoops_tplsource ORDER BY tpl_id LIMIT ".$reccnt.", "._DISPROW_; print($sql."<br>"); $qry = mysql_query($sql, $con); while ($row = mysql_fetch_array($qry)) { print($row["tpl_id"]."<br>"); } //ページ番号リンクを生成 for ($i = 1; $i <= $pagecnt; $i++) { print('<a href="'.$_SERVER['PHP_SELF'].'?page='.$i.'">'.$i.'</a>'); $i <> $pagecnt?print(" | "):""; } ?> <?php //表示行数 define(_DISPROW_, 10); //DB接続 $con = mysql_connect("host", "user", "pass"); mysql_select_db("database", $con); //対象件数よりページ数を取得 $sql = "SELECT COUNT(*) FROM table"; $qry = mysql_query($sql, $con); $allrow = mysql_result($qry, 0); $pagecnt = ceil($allrow / _DISPROW_); //表示ページ番号のレコードを表示 $reccnt = isset($_GET['page'])?($_GET['page'] - 1) * 10:0; $sql = "SELECT id FROM table ORDER BY id LIMIT ".$reccnt.", "._DISPROW_; print($sql."<br>"); $qry = mysql_query($sql, $con); while ($row = mysql_fetch_array($qry)) { print($row["id"]."<br>"); } //ページ番号リンクを生成 for ($i = 1; $i <= $pagecnt; $i++) { print('<a href="'.$_SERVER['PHP_SELF'].'?page='.$i.'">'.$i.'</a>'); $i <> $pagecnt?print(" | "):""; } ?>
お礼
naktakさま こんにちは。ご丁寧なご指導を有難う御座います! 只今、アドバイス頂いたとメールがありましたが、後ほど改めてご報告させていただきますので、宜しくお願い申し上げます。 取り急ぎご挨拶まで・・有難う御座いました!
- yambejp
- ベストアンサー率51% (3827/7415)
具体的なソースを見たなら、どこがわからないか を例を挙げながら聞いたほうが効率的です
お礼
yambejpさま お返事有難う御座います。スクリプトも記載しようと送信してはみたのですが、文字数制限に引っかかってしまい、投函することが出来ずにおりました。今回初めての質問なので要領が掴めておりません。以下、そのスクリプトです。 動作環境…PHP4.3 MySQL4.0 Apacha1.3 winXP (以下、スクリプトは検索結果専用ファイルとして、検索結果一覧ページとなっております。) <?php extract($_GET); mysql_connect('localhost','root','********'); mysql_select_db('TESTdb'); $sql= "select * from test_tb where category like '$category' order by date desc"; $result = mysql_query($sql); $rows = mysql_num_rows($result); f($rows == 0){ echo "<table>\n"; echo "<tr>\n"; echo "<td>\n"; echo " 掲載はありません"; echo "</td>\n"; echo "</tr>\n"; echo "</table>\n"; exit; } else { echo "掲載数"; echo "件"; while($row = mysql_fetch_array($result)){ echo "<table>\n"; echo "<tr>\n"; echo "<td>\n"; echo "<a href=\"../member.php?id=",$row["id"],"\">", $row["file1"] ,"</a>\n"; echo "</td>\n"; echo "</tr>\n"; echo "<tr>\n"; echo "<td>\n"; echo $row["file2"]; echo "<br />"; echo ": "; echo $row["file3"]; echo "<br />"; echo "掲載日:"; echo $row["date"]; echo "</td>\n"; echo "</tr>\n"; echo "</table>\n"; } } mysql_close(); ?>
お礼
naktak様 こんばんは。お世話になっております。 今、ご教授いただいた内容を変更してみましたが、移動後のページのフォームが文字化けしてしまい、同じように「掲載はありません」といった状況になってしまいました。 私のスクリプトに、検索フォームがあるのですが、実際はフォームを非表示にするつもりでおります。 と申しますのも、先に申したように、ここで一度実際に検索し、その検索結果をリンク元であるHTMLによるページに<a href~...>として貼り付けようと考えている事からの手段です。 的を外した説明になりがちでは御座いますが、この検索結果は、categoryというfieldから、10種類ほど中から1つの種別を選んで検索結果(一覧)として表示させようと考えております。 このDBへの登録する際、このfieldには日本語で登録するよう設定しているのですが、今回の文字化けということを考えると、日本語ではなく数値などで登録すれば、この文字化けを回避し、正常な検索結果を得ることが出来るのかな?とも思いましたが、改めご意見をお伺いできれば幸いに思います。 尚、naktak様からお教えいただいているスクリプトを基にした先に記述した私のスクリプト内に、 $sql= "select * from buyer where category like '$category' order by tourokubi desc"; というものがありますが、 buyer where category like '$category' を外すことで、正常に機能することまでは確認しているのですが、これだと先にも申したように、categoryfield内の全てを検索してしまうため、試行錯誤を繰り返しているうち、このような手段を取った経緯となっております。 上手く説明が出来ておりませんが、引き続きご指導頂ければ幸いです。お手数お掛けいたしますが宜しくお願い申し上げます。
補足
naktak様 こんばんは。色々とお世話になりました! 只今、カテゴリ登録を日本語ではなく、数値で登録するよう設定したところ、無事、望んでいる結果を得ることが出来ました。 事細かなご指導に感謝しております。有難う御座いました!