アプリ版:「スタンプのみでお礼する」機能のリリースについて

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 );

?>
ここまで↑

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

A 回答 (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が日本語だとちょっとアレですが(汗

この回答への補足

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

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

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

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

補足日時:2008/01/30 16:06
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/02/05 14:44

print $sql;


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

この回答への補足

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

補足日時:2008/01/30 15:54
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/02/05 14:45

とりあえず



$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'] ) . "%' ";

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

この回答への補足

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

>$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
    • good
    • 0

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