• ベストアンサー

チェックボックス&セレクトボックスからの検索

htmlからチェックボックス&セレクトボックスを使って postgresで検索し、phpで表示するフォームを作っています。 チェックボックスで検索されたデータをセレクトボックスで 絞り込みたいのですがうまくいきません。 or の部分を and に変えたりしたのですが検索結果が 変わってしまいます。 どなたか教えてもらえないでしょうか。 HTML <input type="checkbox" name="chk1" value="1">chk1 <input type="checkbox" name="chk2" value="1">chk2 <select name="add">  <option value="北海道">北海道</option>  <option value="沖縄">沖縄</option> </select> PHP  if ($chk1 != "") {   $sqlSelect .= "abc = '" . $chk1 . "' or ";  }  if ($chk2 != "") {   $sqlSelect .= "abc = '" . $chk2 . "' or ";  }  if ($add != "") {   $sqlSelect .= "add = '" . $add . "' ;  }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.6

>if文で分岐させようとするのですがすごい数になりそうです。 こういう風にやったりする。 formのチェックボックスのname 同じ名前にして、配列で渡すように[]つけとく。 <input type="checkbox" name="chk[]" value="アパート">アパート <input type="checkbox" name="chk[]" value="マンション">マンション <input type="checkbox" name="chk[]" value="戸建">戸建 php側 $sql = 'select * from テーブル名 where '; if($_POST["chk"]){  foreach($_POST["chk"] as $val){   $ary[] = 'type = "'.$val.'"';  }  $sql .= '('.implode(' or ',$ary).') and area="'.$_POST["add"].'"'; } print $sql; まぁ、これが正解ってわけじゃなし。 いろいろ考えてみてくださいな。

miya0726
質問者

補足

わざわざありがとうございます。 試してみるのですがtypeの値を拾ってないようです if($_POST["chk"]){ っていうのはchk[]にチェックが入っていれば実行 と考えてよろしいですよね

その他の回答 (8)

  • cojirou
  • ベストアンサー率50% (59/117)
回答No.9

$sql = "select * from tablename "; $onchk1 = ($chk1 == "" ? "" : " type='$chk1' "); if($chk2){ $onchk2 = ($onchk1 == "" ? " type='$chk2' " : " or type='$chk2' "); } if($chk3){ $onchk3 = (($onchk1 == $onchk2 == "") ? " type='$chk3' " : " or type='$chk3' "); } if($_POST["chk"]{ $onadd = ($add == "" ? "" : " and area='$add' "); $sql .= "where (". $onchk1 . $onchk2 . $onchk3 .")". $onadd; } else { $onadd = ($add == "" ? "" : " where area='$add' "); $sql .= $onadd; } 動かしてみてもないし、自信もないし、あまり簡潔とは 言えないけど、これでどうでしょうか? ご参考までに。

miya0726
質問者

お礼

お返事ありがとうございます。 こういう書き方もあるのですね。 今回はguruguru2さんのコードで作成できましたが 次回詰まったときに参考にさせていただきます。 ありがとうございます。

回答No.8

>if($_POST["chk"]){ >っていうのはchk[]にチェックが入っていれば実行 >と考えてよろしいですよね そのつもり。 POSTでわたしてますよね。

miya0726
質問者

お礼

できました!postgresに渡すときに "val"ではエラーになり 'val' にしなくてはならないところが苦労しました。 また、北海道○○市とかも検索したかったのでlike文も使いました。 $sql = 'select * from テーブル名 where '; if($_POST["chk"]){  foreach($_POST["chk"] as $val){   $ary[] = "type = '" . $val . "'";  }  $sql .= '('.implode(' or ',$ary).')';  $sql .= " and area like '%" . $add . "%' "; } 大変勉強になりました。 ありがとうございました。

回答No.7

>この場合のアパートの後のorをandへの変更です。 やっぱり意味わからない... #6のコードじゃダメかな。

回答No.5

>すべてのtypeの後ろが or ではなく )and が >付く可能性があるんですよね・・・ ん、なんで? type = "アパート" and type ="マンション" なんて、例がありえるの。

miya0726
質問者

補足

チェックがアパートの場合 select * from テーブル名 where (type = "アパート" ) and area = "北海道" チェックがアパート・戸建の場合 select * from テーブル名 where (type = "アパート" or type = "戸建" ) and area = "北海道" となりますよね。 この場合のアパートの後のorをandへの変更です。

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.4

フラグを使って、以下のようにやれば実現できるかと思われます。 各条件でor / and を選択することも可能です。 PHP  if ($chk1 != "") { if ($qch) { sqlSelect .= " or"; } else { sqlSelect .= " where"; }   $sqlSelect .= "abc = '" . $chk1 . "'"; $qch++;  }  if ($chk2 != "") { if ($qch) { sqlSelect .= " or"; } else { sqlSelect .= " where"; }   $sqlSelect .= "abc = '" . $chk2 . "'"; $qch++;  }  if ($chk3 != "") { if ($qch) { sqlSelect .= " or"; } else { sqlSelect .= " where"; }   $sqlSelect .= "abc = '" . $chk3 . "'"; $qch++;  }  if ($add != "") { if ($qch) { sqlSelect .= " or"; } else { sqlSelect .= " where"; }   $sqlSelect .= "add = '" . $add . "' ; $qch++;  }

miya0726
質問者

補足

お返事ありがとうございます。 色々試してみたのですが動いてくれません。 $qch は何も設定しなくてもよいのでしょうか。

回答No.3

あ、何がわからないのか、わかったかも。 >4)アパート・マンション・戸建を北海道で検索すると6件ヒット だったら select * from テーブル名 where (type = "アパート" or type = "マンション" or type = "戸建") and area = "北海道" って()つければ、ってことじゃないのかな。

miya0726
質問者

補足

()を使う事ができるのですね、コンソールで確認できました! ありがとうございます。 PHPですが、すべてのtypeの後ろが or ではなく )and が 付く可能性があるんですよね・・・ if文で分岐させようとするのですがすごい数になりそうです。

回答No.2

PHPというか、SQLの話ですね。 type、areaというフィールドがあるとして、 >1)アパートを北海道で検索すると3件ヒット だったら、 select * from テーブル名 where type = "アパート" and area = "北海道" ですよね。 自分の望む結果を得るには どういったSQL発行すればよいのか、考えてみてください。

miya0726
質問者

補足

お返事ありがとうございます。 おっしゃるように select * from テーブル名 where type = "アパート" and area = "北海道" とすれば検索できます しかしマンション、戸建もありますので and が使えないのです。

noname#86752
noname#86752
回答No.1

何がどう悪いのか判らないのですが、気付いた点を。 1.chk1とchk2がどちらもabcという項目の条件をつけるものだが、どちらもvalueが1なので、どちらにチェックをつけても同じ条件になるのでは? 2.orとandは全然ちがうので変えたら絞込み結果が変わるのは当然です。 とりあえず、何をどうしたいのか整理してください。 もし可能なら出来上がったSQLをプログラムからではなく、コンソールに貼り付けて実行してみてください。

miya0726
質問者

補足

お返事ありがとうございます。 説明不足ですみません。 checkboxを簡易化しようと思い間違って書いてしまいました。 不動産の物件検索サイトを作っていまして下記の様になります。 HTML <input type="checkbox" name="chk1" value="アパート">アパート <input type="checkbox" name="chk2" value="マンション">マンション <input type="checkbox" name="chk3" value="戸建">戸建 PHP  if ($chk1 != "") {   $sqlSelect .= "abc = '" . $chk1 . "' or ";  }  if ($chk2 != "") {   $sqlSelect .= "abc = '" . $chk2 . "' or ";  }  if ($chk3 != "") {   $sqlSelect .= "abc = '" . $chk3 . "' or ";  }  if ($add != "") {   $sqlSelect .= "add = '" . $add . "' ;  } 1)アパートを北海道で検索すると3件ヒット 2)マンションを北海道で検索すると2件ヒット 3)戸建を北海道で検索すると1件ヒット 4)アパート・マンション・戸建を北海道で検索すると6件ヒット 5)アパートを沖縄で検索すると4件ヒット 6)マンションを沖縄で検索すると1件ヒット 7)戸建を沖縄で検索すると2件ヒット 8)アパート・マンション・戸建を沖縄で検索すると7件ヒット 9)全検索すると13件ヒット 上記のように作りたいです chk別で検索することはできるのですが、 アパート or マンション or 戸建 or 県 のため 県別で絞り込むことができません。 アパート or マンション or 戸建 and 県 にしても 同じでした。 関数の使い方自体が間違っているのでしょうか。

関連するQ&A