- ベストアンサー
MySQL複数検索時の条件設定簡略化について
PHP+MySQLで、複数の検索項目があります。 それぞれの項目とフィールドは、一対での検索になります。 検索1 入力欄=$a 検索2 入力欄=$b 検索3 入力欄=$c 上記みたいな検索項目があります。 複数検索で、select * db where a=$a and b=$b and c=$c and ~ と設定しています。(a,b,cはフィールド名) この方式での検索だと、3つの項目にそれぞれ何か入っていないと 表示されません。(検索時に空白があると、表示されません。 ) 空白があっても、検索されるようにするにはどうしたらいいでしょうか。 それとも、たくさんの条件設定(aが空白の場合など)が必要でしょうか。 ご教授ください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
10項目もあるのでしたら、またさらに増えるかも知れないのでしたら、WHERE句の生成ではループ処理をしたらいいと思います。 ループ処理のためには $a $b $c では都合がよくないので $a[x] のような配列に転送しておく必要があります。 それと、もしどの項目も設定されていない場合に全件を対象で参照するのか、1億件もデータがあったら困りますので、どれか1つは入力するようなチェックをするか、LIMITを使って1度に参照する件数を制御した方がいいと思います。
その他の回答 (2)
- masa6272
- ベストアンサー率66% (93/140)
入力フォームはあるんですよね? だったらissetは、常にtrueになってしまうんで・・・ 使うんでしたら、!emptyでしょうね。 それは、ともかく・・・ SELECT * FROM テーブル名 WHERE ({$a} = "" OR a = {$a}) AND ({$b} = "" OR b = {$b}) AND ({$c} = "" OR c = {$c}); では、どうでしょう? もし、$a、$b、$cが全部空白のとき、全件ならこのまま。 もし、$a、$b、$cが全部空白のとき、一件もいらないなら、PHPで判断して、SQLなんか最初から発行しない。
お礼
ありがとうございました。 これでやってみたのですが、{$a} = ""のとき、 やはり検索できませんでした。 考え方が参考になりました!
- yambejp
- ベストアンサー率51% (3827/7415)
ポイントが2点。 1)データがあるかどうかひとつずつチェックが必要なこと 2)すべてが空だった場合は検索しないということ 総じてこんな感じ <? $sql="select * db where 1"; if(!(isset($a) or isset($b) or isset($c))) $sql.=" and 0"; if(isset($a)) $sql.=" and a='{$a}'"; if(isset($b)) $sql.=" and b='{$b}'"; if(isset($c)) $sql.=" and c='{$c}'"; print $sql; ?> where 1というのはすべて表示するということ。 $a、$b、$cのすべてがセットされていない場合は1 and 0つまり 一つもヒットしなくなります。 $a、$b、$cのどれかがセットされていればそれぞれ検索ワードが 設定されます。
お礼
回答ありがとうございます。 やはり、条件を指定していかないといけないのですね。 現在10項目あるので、それぞれのパターンを作らないといけないですよね・・・
お礼
ありがとうございます。 最終的には、配列で行わなかったのですが、制御の考え方が参考になりました!