プロが教える店舗&オフィスのセキュリティ対策術

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 . "' ;
 }

A 回答 (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;

まぁ、これが正解ってわけじゃなし。
いろいろ考えてみてくださいな。

この回答への補足

わざわざありがとうございます。
試してみるのですがtypeの値を拾ってないようです

if($_POST["chk"]){
っていうのはchk[]にチェックが入っていれば実行
と考えてよろしいですよね

補足日時:2004/07/28 00:41
    • good
    • 0

$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;
}
動かしてみてもないし、自信もないし、あまり簡潔とは
言えないけど、これでどうでしょうか?
ご参考までに。
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。
こういう書き方もあるのですね。

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

お礼日時:2004/07/28 23:25

>if($_POST["chk"]){


>っていうのはchk[]にチェックが入っていれば実行
>と考えてよろしいですよね

そのつもり。
POSTでわたしてますよね。
    • good
    • 0
この回答へのお礼

できました!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 . "%' ";
}

大変勉強になりました。
ありがとうございました。

お礼日時:2004/07/28 23:23

>この場合のアパートの後のorをandへの変更です。



やっぱり意味わからない...
#6のコードじゃダメかな。
    • good
    • 0

>すべてのtypeの後ろが or ではなく )and が


>付く可能性があるんですよね・・・

ん、なんで?
type = "アパート" and type ="マンション"
なんて、例がありえるの。

この回答への補足

チェックがアパートの場合
select * from テーブル名 where (type = "アパート" ) and area = "北海道"

チェックがアパート・戸建の場合
select * from テーブル名 where (type = "アパート" or type = "戸建" ) and area = "北海道"

となりますよね。
この場合のアパートの後のorをandへの変更です。

補足日時:2004/07/27 17:51
    • good
    • 0

フラグを使って、以下のようにやれば実現できるかと思われます。


各条件で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 は何も設定しなくてもよいのでしょうか。

補足日時:2004/07/27 18:07
    • good
    • 0

あ、何がわからないのか、わかったかも。


>4)アパート・マンション・戸建を北海道で検索すると6件ヒット
だったら

select * from テーブル名 where (type = "アパート" or type = "マンション" or
type = "戸建") and area = "北海道"

って()つければ、ってことじゃないのかな。

この回答への補足

()を使う事ができるのですね、コンソールで確認できました!
ありがとうございます。

PHPですが、すべてのtypeの後ろが or ではなく )and が
付く可能性があるんですよね・・・
if文で分岐させようとするのですがすごい数になりそうです。

補足日時:2004/07/27 16:54
    • good
    • 0

PHPというか、SQLの話ですね。



type、areaというフィールドがあるとして、

>1)アパートを北海道で検索すると3件ヒット

だったら、
select * from テーブル名 where type = "アパート" and area = "北海道"
ですよね。

自分の望む結果を得るには
どういったSQL発行すればよいのか、考えてみてください。

この回答への補足

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

補足日時:2004/07/27 15:11
    • good
    • 0

何がどう悪いのか判らないのですが、気付いた点を。



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 県 にしても
同じでした。

関数の使い方自体が間違っているのでしょうか。

補足日時:2004/07/27 10:16
    • good
    • 0

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