プロが教える店舗&オフィスのセキュリティ対策術

上が検索フォーム、下が検索結果のように、画面を横割りにフレーム分割しています。
この検索結果リストの各カラムヘッダにハイパーリンクを仕込んで、
それをクリックするたびに昇順⇔降順でソートさるようにしたいですが、
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他プログラミング知識なし

A 回答 (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>
    • good
    • 0
この回答へのお礼

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さんには本当に助けていただきました。
心より御礼申し上げます。

お礼日時:2005/08/30 16:37

こんな感じを考えているのでしょうか?


かなりはしょっているので、エラー処理などは適宜いれてください。

<?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>
    • good
    • 0
この回答へのお礼

yambejpさん、早速ありがとうございます。

#1さんへの御礼にも書きましたが、

yambejpさんにご提示いただいたサンプルも
なんとなく、雰囲気はつかめたるですが
今回は、POSTを使ってます。
関係なくGETで使えるものでしょうか?

とんちんかんなことを言ってたらすみません

お礼日時:2005/08/29 12:51

例えば



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";
}

とかすればいいとおもいます。
    • good
    • 0
この回答へのお礼

moon_nightさん、早速ありがとうございます。

なんとなく、なるほどなぁと雰囲気はつかめたのですが
今回は、POSTを使ってますが、関係なく
GETで使えるものでしょうか?

とんちんかんなことを言ってたらすみません

お礼日時:2005/08/29 12:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!