- ベストアンサー
検索結果のテーブルの各カラムヘッダをキーにソートしたい
上が検索フォーム、下が検索結果のように、画面を横割りにフレーム分割しています。 この検索結果リストの各カラムヘッダにハイパーリンクを仕込んで、 それをクリックするたびに昇順⇔降順でソートさるようにしたいですが、 PHP側をどのように改造する必要がありますでしょうか? 下記の例では、価格、書名がリンクになるイメージです。 【上段フレーム: search_form.htm】 <HTML> <HEAD></HEAD> <BODY> <FORM method="POST" action="list.php" target="result_list"> 書名<INPUT size="44" type="text" name="title"> を含む <INPUT type="submit" name="exec" value="検索"> </FORM> </BODY> </HTML> 【下段フレーム: result_list.php】 <?php $con = mysql_connect(DBSERVER, DBUSER, DBPASSWORD); $selectdb = mysql_select_db(DBNAME, $con); $sql = "select * from bookdb where (title like '%$title%') order by price"; $rst = mysql_query($sql, $con); $recmax = mysql_num_rows($rst); $body = "<B>$recmax 冊みつかりました。</B>"; $body .= "<TABLE border='1'> <TR> <TD>価格</TD> <TD>書名</TD> <TR>\n"; while($col = mysql_fetch_array($rst)) { $body .= "<TR>\n"; $body .= "<TD>" . $col["price"] . "</TD>\n"; $body .= "<TD>" . $col["title"] . "</TD>\n"; $body .= "</TR>\n"; } $body .= "</TABLE>\n"; mysql_free_result($rst); $con = mysql_close($con); ?> <HTML> <HEAD></HEAD> <BODY> <?= $body ?> </BODY> </HTML> ■ 環境 PHP 5.0.4 Win MySQL mysql 4.0.14b Win ■知識レベル: HTMLタグ打ち、初歩的なSQLを理解できる程度、PHP他プログラミング知識なし
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#2です。 register_globalsをonにするか、$_POSTと$_GETの 両方の処理をいれれば動きます。 ちなみに前回のスクリプト自体register_globalsがonの前提。 通常は$_GETや$_POSTで受けます。 javascriptを使うと、ユーザーの環境に依存してしまう ため個人的にはこの手の検索フォームにjavascriptは使いたく ないのですが、参考までにPOSTをつかった例を挙げておきます。 POSTとなっているところをGETにかえればそのままGETになります。 <?PHP $key=$_POST["key"]; $sort=$_POST["sort"]; $sort_price="asc"; $sort_title="asc"; if ($key!=""){ $orderby="ORDRE BY $key $sort"; switch ($key){ case "price": if ($sort=="asc") $sort_price="desc"; break; case "title": if ($sort=="asc") $sort_title="desc"; break; } } $body="select * from bookdb where (title like '%\$title%') $orderby"; //SQL処理 $body.=<<<eof <hr> <a href="javascript:sendForm('','')">ソートなし</a><br> <a href="javascript:sendForm('price','$sort_price')">価格</a><br> <a href="javascript:sendForm('title','$sort_title')">書名</a> <form action="$PHP_SELF" method="POST"> <input type="hidden" name="key" value="$key"> <input type="hidden" name="sort" value="$sort"> </form> eof; ?> <html> <body> <?= $body ?> <script language="javascript"> function sendForm(num1,num2){ var f=document.forms[0]; f.key.value=num1; f.sort.value=num2; f.submit(); } </script> </body> </html>
その他の回答 (2)
- yambejp
- ベストアンサー率51% (3827/7415)
こんな感じを考えているのでしょうか? かなりはしょっているので、エラー処理などは適宜いれてください。 <?PHP $url_price="$PHP_SELF?key=price&sort=asc"; $url_title="$PHP_SELF?key=title&sort=asc"; if ($key!=""){ $orderby="ORDRE BY $key $sort"; switch ($key){ case "price": if ($sort=="asc") $url_price="$PHP_SELF?key=price&sort=desc"; break; case "title": if ($sort=="asc") $url_title="$PHP_SELF?key=title&sort=desc"; break; } } $body="select * from bookdb where (title like '%\$title%') $orderby"; //SQL処理 $body.=<<<eof <hr> <a href="$PHP_SELF">ソートなし</a><br> <a href="$url_price">価格</a><br> <a href="$url_title">書名</a> eof; ?> <html> <body> <?= $body ?> </body> </html>
お礼
yambejpさん、早速ありがとうございます。 #1さんへの御礼にも書きましたが、 yambejpさんにご提示いただいたサンプルも なんとなく、雰囲気はつかめたるですが 今回は、POSTを使ってます。 関係なくGETで使えるものでしょうか? とんちんかんなことを言ってたらすみません
- moon_night
- ベストアンサー率32% (598/1831)
例えば if ($_GET['f']) { $flag = ""; } else { $flag = "1"; } として、 <A href="result_list.php?f=$flag"> とします。 そして if ($flag) { $sql = "select * from bookdb where (title like '%$title%') order by price desc"; } else { $sql = "select * from bookdb where (title like '%$title%') order by price"; } とかすればいいとおもいます。
お礼
moon_nightさん、早速ありがとうございます。 なんとなく、なるほどなぁと雰囲気はつかめたのですが 今回は、POSTを使ってますが、関係なく GETで使えるものでしょうか? とんちんかんなことを言ってたらすみません
お礼
yambejpさん、こちらでも大変お世話になりました。 > ちなみに前回のスクリプト自体register_globalsがonの前提。 通常は$_GETや$_POSTで受けます。 すみません、register_globalsの問題はやはりつまずいて少し わかってましたが、作成中のもの=OFFの前提、 本質問で提示したサンプル=ONの前提でしたね。 #1さんとyambejpさんのものが使いこなせなそうで 途方にくれてたのですが、ご提示いただいたサンプルを ヒントに、結局 (1) フォーム側でどういうキーでソートするか予め指定 (2) 指定されたソート条件をPHPで受け取ってORDER BY句を切り替え ・・という風にすれば、何とかなるかもしれないと 以下の二点組み合わせてなんとか実装できました。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1614695 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1613811 #1さん、 yambejpにご提示いただいたものについてもよく勉強して、 次回以降(もう少しわかってきたら)、使わせていただきたいです。 別質問も含め、yambejpさんには本当に助けていただきました。 心より御礼申し上げます。