こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

MySQLで昇順に並べ替え

MySQL(データベース)で商品名と価格を格納したテーブル(syouhin)があります。商品名のキーワードを入力するフォーム(form.html)とデータを受け取る(kensaku.php)があり、以下のようにデータを表示させています。

<!-- form.html -->
<html>
<head>
<title>商品名と価格</title>
</head>
<body>
<form method="get" action="kensaku.php">
<input type="text" name="name">
<input type="submit" name="submit" value="検索">
</form>
</body>
</html>

//kensaku.php
<?
$name=$_REQUEST["name"];

$conn = mysql_connect ("localhost", "username", "password")
or die ('接続できませんでした');
mysql_select_db ("db",$conn);

//クエリ生成
$sql = "select * from syouhin where name like '%$name%'";

$res = mysql_query($sql);

while($row = mysql_fetch_array($res)){
echo "<table border='1' cellpadding='0' cellspacing='0'>";
echo "<tr>";
echo "<td>".$row[name]."</td>";
echo "<td>".$row[price]."</td>";
echo "</tr>";
echo "</table>";
}
?>
ここから質問なんですが、今結果が表示されているまさにそのページで、並べ替えをしたいのです。よく検索結果の並べ替えで、[価格の安い順に並べる]をクリックすると並び変わるのがありますよね。それと同じ事をしたいのです。
僕が考えた方法は、もう一つのページ(例えば、kensaku_asc.php)を作って、
$sql = "select * from syouhin where name like '%$name%'";
の部分だけを
$sql = "select * from syouhin where name like '%$name%' order by price";
に変えて、そのページにリンクさせる。でもその場合、form.htmlから受け取ったデータ(ここでは商品名のキーワード)を引き継ぐという事ができないので、そのあたりのところのヒントをいただければと存じます。よろしくお願いします。

投稿日時 - 2010-03-30 21:40:56

QNo.5791018

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

5人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(3)

ANo.3

むしろそちらの方が正解です。

言葉通りに「if文を追加」して、
if(条件1){処理1}
if(条件2){処理2}
else{処理3}
とやってしまうと条件1に合致し処理1を実行した後も、処理2または処理3を実行してしまう事になるので、矛盾が生じます。

なので、仰る通り、
if(条件1){処理1}
elseif(条件2){処理2}
else{処理3}
などとelseifを追加するという記述で正解です。

あと、以下は質問内容から逸れ、蛇足となりますが…
$_REQUESTを使用していらっしゃるのは書籍等で見たのかな…?
今回の例では$_REQUESTで値を取得しても「動くには動く」のですが、$_REQUESTは使わず、$_COOKIE、$_GET、$_POSTなどとしてデータ元を明らかにする方が良いと個人的には思います。

それと、ユーザの入力値を何も処理せずにそのままデータベースに渡すのは少々危険な香りがします。
$name=mysql_real_escape_string($_GET["name"]);
などとした方が良いです。
http://php.net/manual/ja/function.mysql-real-escape-string.php

投稿日時 - 2010-04-01 14:39:00

ANo.2

すみません。
間違えてました。
検索ファイルの名前が、kensaku.phpであれば、リンクさせたい場合は
<a href="kensaku.php?name=<?php echo $_GET["name"]; ?>&sort=asc">ソート</a>
<a href="kensaku.php?name=<?php echo $_GET["name"]; ?>">ソートを解除</a>
です。


同一ファイル上で、GETで渡されるsortの値によって処理を切り替えるという事です。

/* ここにデータベース接続処理を記述 */
if($_GET["sort"] == "asc"){
//$_GET["sort"]の値がascの場合はORDER付きのSQL
$sql = "select * from syouhin where name like '%$name%' order by price";
}
else{
//$_GET["sort"]が指定されてない場合は通常のSQL
$sql = "select * from syouhin where name like '%$name%'";
}
/* 以下にSQLを実行して結果を表示する処理を記述 */

if文を追加し、$_GET['sort']で渡すパラメータを変更する事で複数のパターンのSQLを実行する事ができます。

投稿日時 - 2010-03-31 13:24:33

補足

buraru様、返事が遅れまして申し訳ございません。
>if文を追加し、$_GET['sort']で渡すパラメータを変更する事で複数のパターンのSQLを実行する事ができます。
if文を追加する場合、
if(){
}
の下に
else if(){
}

をパターン分だけ記述してあげて、最後に
else(){
}
で締めくくる感じで出来ました。動作したということは文法的には問題ないということでよろしいでしょうか?宜しければご確認の程お願いいたします。

投稿日時 - 2010-04-01 09:45:54

ANo.1

kensaku_asc.phpにリンクする場合にkensaku.phpで受け取ったGETのパラメータを以下のようにkensaku_asc.phpに渡してやる事でキーワードを引き継ぐ事が出来ます。

kensaku_asc.php?name=<?php echo $_GET["name"]; ?>

ただ、新しくファイルを作るよりは、同一ファイル上でアクションを分けてやった方が良いかと思います。
例えば
if($_GET["mode"] == "search"){
 if($_GET["sort"] == "asc"){
  ソートする場合の処理
 }
 else{
  ソートしない場合の処理
 }
}

ソートさせたい場合のリンクはこんな感じで。
kensaku_asc.php?name=<?php echo $_GET["name"]; ?>&sort=asc

投稿日時 - 2010-03-30 22:46:19

補足

buraru様、ご回答ありがとうございます。
>新しくファイルを作るよりは、同一ファイル上でアクションを分けてやった方が良いかと
とありますが、

>ソートさせたい場合のリンクはこんな感じで。
kensaku_asc.php?name=<?php echo $_GET["name"]; ?>&sort=asc

となっているのでやはり、新しいファイル(kensaku_asc.php)を作るという意味でしょうか?宜しくお願いします。

投稿日時 - 2010-03-31 07:02:45

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-