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

締切り済みの質問

php5+Mysql5による条件検索とその表示方法が上手く動作しないのでどなたかご指摘をお願いします。

phpにて条件検索を行っているのですが、『where』以下を$変数にすると動かなくなってしまいます。記述部分で何が間違っているのでしょうか?

以下記述↓
<?

$link = db_con(); //←DB接続

$sql = "select * from tbl where
id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and
name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' ";
$result = mysql_query( $sql ) ;
$num_rows = mysql_num_rows( $result );

?>
ここまで↑

を下記のように『where』以下を$変数にして代入

$変数した場合↓
<?

$where .= "id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' ";

$link = db_con(); //←DB接続

$sql = "select * from tbl where $where ";
$result = mysql_query( $sql ) ;
$num_rows = mysql_num_rows( $result );

?>
ここまで↑

どなたかご指摘をお願いします。

投稿日時 - 2008-01-29 13:45:18

QNo.3724492

すぐに回答ほしいです

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

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

回答(3)

ANo.3

>if ( (!empty($_GET['id'] ) && (!empty($_GET['name']) ) {
>$where = "1";
>}else{
>$where = "id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' "; //←修正しました
>}

$where = "1"; と条件セットと逆?

最初の投稿では「$whereを変数にすると動作しない」ということでしたよね?そうであれば、両方の$sqlを比較すれば違いが必ずあるハズです。

No.2のようにSQL文をprintして違いがないかチェックしてください。


(蛇足)
idの一致だけで一意に決まると思うので、nameまでlikeで条件になっているのでちょっと不安なのですが(idが他のテーブルとの結合用ならいいのですが・・)抽出件数が「存在する」SQLですよね?nameが日本語だとちょっとアレですが(汗

投稿日時 - 2008-01-29 19:19:36

補足

始めて3日程度なもので調べながらやっているので遅くなりました。
まだできていませんが...(汗(汗(汗

>$where = "1"; と条件セットと逆?
 ↑これはどういう意味でしょうか?

>No.2のようにSQL文をprint・・・
知らないことなので調べながらやってます...(汗

>idの一致だけで・・・
テスト的にやっているのでidでやっていました。
実際はidを除く3項目(住所、年齢、性別)の条件検索です。
idでテストすると何か問題がありますか?

投稿日時 - 2008-01-30 16:06:48

お礼

有難う御座いました。
時間が掛かってしまいましたが、
できました!!

投稿日時 - 2008-02-05 14:44:36

ANo.2

print $sql;
をしてSQL構文が正しいかチェックしてください。

投稿日時 - 2008-01-29 18:26:44

補足

お返事が遅れてしまい申し訳ございません。
調べながらやっているもので・・・。
チェックしてみます。

投稿日時 - 2008-01-30 15:54:32

お礼

遅くなりましたが何とかできました♪
アドバイス有難うございました!!

投稿日時 - 2008-02-05 14:45:50

ANo.1

とりあえず

$result = mysql_query($sql) or die('Query failed: ' . mysql_error() . ":sql=>" . $sql);

などとして「エラー内容」と「そのときに生成されたSQL文」を確認してください。


>$where .= "id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' ";

$where .= ($whereに追加)ということですが、最初の$whereの状態はどうなっているんでしょう?

$where = "id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' ";

と書きたかったのでしょうか?

投稿日時 - 2008-01-29 14:08:01

補足

ご指摘有難うございます。
よく、参考にさせて頂いております。

>$result = mysql_query($sql) or die('Query failed: ' . mysql_error() . ":sql=>" . $sql);
を記述してもエラー表示がされず、
検索結果は0件です。という表示がでていたのみでした...。

>$where .= ($whereに追加)ということですが・・・
『$where .= 』と『$where =』の意味の違いを理解していませんでした。ご指摘頂いた通り
>$where = "id = '" . mysql ・・・ 
の意味です。

ご指摘頂きやすいように具体的に掲示致します。
複数条件検索 ※0の場合  → 全件表示
       ※合致の場合 → 抽出結果表示

以下のように記述するのかな?と考えてやってみたのですが
動作しません。

--<sch.php>--
<?
$link = db_connect();
?>
<? require( './head.php' ) ?>
<div align="center">
<h2>検索</h2>
<br>
<form action="res.php" method="get">
<br>ID<input type="text" name="id" size=16 maxlength=16>
<br>名<input type="text" name="name" size=64 maxlength=64>
<br>
<input type="submit" value="検索">
<input type="reset" value="リセット">
</form>
</div>
<? require( './footer.php' ) ?>
?>
--<sch.php>--

--<res.php>--

if ( (!empty($_GET['id'] ) && (!empty($_GET['name']) ) {
$where = "1";
}else{
$where = "id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' "; //←修正しました
}

$link = db_con(); //←DB接続

$sql = "select * from tbl where $where ";
$result = mysql_query( $sql ) or die('Query failed: ' . mysql_error() . ":sql=>" . $sql);
$num_rows = mysql_num_rows( $result );

$sql = "select * from tbl where $where order by id desc limit ${_GET['page']}, ${_GET['rows']} ";
$result = mysql_query( $sql ) or die('Query failed: ' . mysql_error() . ":sql=>" . $sql) ;

----<res.php>--

根本的に理解していないのでしょうか...。
ご指摘の程、宜しくお願い申し上げます。

投稿日時 - 2008-01-29 15:18:20

あなたにオススメの質問