- ベストアンサー
チェックボックス&セレクトボックスからの検索
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 . "' ; }
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
>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; まぁ、これが正解ってわけじゃなし。 いろいろ考えてみてくださいな。
その他の回答 (8)
- cojirou
- ベストアンサー率50% (59/117)
$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; } 動かしてみてもないし、自信もないし、あまり簡潔とは 言えないけど、これでどうでしょうか? ご参考までに。
お礼
お返事ありがとうございます。 こういう書き方もあるのですね。 今回はguruguru2さんのコードで作成できましたが 次回詰まったときに参考にさせていただきます。 ありがとうございます。
- GuruGuru22
- ベストアンサー率51% (177/346)
>if($_POST["chk"]){ >っていうのはchk[]にチェックが入っていれば実行 >と考えてよろしいですよね そのつもり。 POSTでわたしてますよね。
お礼
できました!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 . "%' "; } 大変勉強になりました。 ありがとうございました。
- GuruGuru22
- ベストアンサー率51% (177/346)
>この場合のアパートの後のorをandへの変更です。 やっぱり意味わからない... #6のコードじゃダメかな。
- GuruGuru22
- ベストアンサー率51% (177/346)
>すべてのtypeの後ろが or ではなく )and が >付く可能性があるんですよね・・・ ん、なんで? type = "アパート" and type ="マンション" なんて、例がありえるの。
補足
チェックがアパートの場合 select * from テーブル名 where (type = "アパート" ) and area = "北海道" チェックがアパート・戸建の場合 select * from テーブル名 where (type = "アパート" or type = "戸建" ) and area = "北海道" となりますよね。 この場合のアパートの後のorをandへの変更です。
- moon_night
- ベストアンサー率32% (598/1831)
フラグを使って、以下のようにやれば実現できるかと思われます。 各条件で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++; }
補足
お返事ありがとうございます。 色々試してみたのですが動いてくれません。 $qch は何も設定しなくてもよいのでしょうか。
- GuruGuru22
- ベストアンサー率51% (177/346)
あ、何がわからないのか、わかったかも。 >4)アパート・マンション・戸建を北海道で検索すると6件ヒット だったら select * from テーブル名 where (type = "アパート" or type = "マンション" or type = "戸建") and area = "北海道" って()つければ、ってことじゃないのかな。
補足
()を使う事ができるのですね、コンソールで確認できました! ありがとうございます。 PHPですが、すべてのtypeの後ろが or ではなく )and が 付く可能性があるんですよね・・・ if文で分岐させようとするのですがすごい数になりそうです。
- GuruGuru22
- ベストアンサー率51% (177/346)
PHPというか、SQLの話ですね。 type、areaというフィールドがあるとして、 >1)アパートを北海道で検索すると3件ヒット だったら、 select * from テーブル名 where type = "アパート" and area = "北海道" ですよね。 自分の望む結果を得るには どういったSQL発行すればよいのか、考えてみてください。
補足
お返事ありがとうございます。 おっしゃるように select * from テーブル名 where type = "アパート" and area = "北海道" とすれば検索できます しかしマンション、戸建もありますので and が使えないのです。
何がどう悪いのか判らないのですが、気付いた点を。 1.chk1とchk2がどちらもabcという項目の条件をつけるものだが、どちらもvalueが1なので、どちらにチェックをつけても同じ条件になるのでは? 2.orとandは全然ちがうので変えたら絞込み結果が変わるのは当然です。 とりあえず、何をどうしたいのか整理してください。 もし可能なら出来上がったSQLをプログラムからではなく、コンソールに貼り付けて実行してみてください。
補足
お返事ありがとうございます。 説明不足ですみません。 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 県 にしても 同じでした。 関数の使い方自体が間違っているのでしょうか。
補足
わざわざありがとうございます。 試してみるのですがtypeの値を拾ってないようです if($_POST["chk"]){ っていうのはchk[]にチェックが入っていれば実行 と考えてよろしいですよね