- ベストアンサー
PHPでチェックボックスによる絞込みを実装する方法
- PHPとSQLを使用して、チェックボックスを使って複数条件によるデータの絞り込みを行う方法について教えてください。
- 現在、全てのチェックが入っている場合にしかデータが表示されない状況であり、どのように変更すれば良いかわからない状態です。
- ソースコードの一部を示し、それに対して改善策やアドバイスをいただきたいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
これはテクニックがあります。 (1)全件表示は「WHERE 1」とします (2)絞り込みをするときはANDでつなぎます (3)同じカテゴリでやるときは0にORでつなぎます。 場合によってはINで処理してもよいでしょう。 なお、運用の際にはきちんとエスケープ処理をいれましょう。 <?php $where=""; foreach((array) $_REQUEST['gakunen'] as $key=>$gakunen){ if($key==0) $where.=" AND (0"; $where .= " OR `gakunen`='".$gakunen."'"; //$where .= " OR `gakunen`='".mysql_real_escape_string($gakunen)."'"; if($key==count($_REQUEST['gakunen'] ) -1) $where.=")"; } foreach((array) $_REQUEST['seibetsu'] as $key=>$seibetsu){ if($key==0) $where.=" AND (0"; $where .= " OR `seibetsu`='".$seibetsu."'"; //$where .= " OR `seibetsu`='".mysql_real_escape_string($seibetsu)."'"; if($key==count($_REQUEST['seibetsu'] ) -1) $where.=")"; } foreach((array) $_REQUEST['club'] as $key=>$club){ if($key==0) $where.=" AND (0"; $where .= " OR `club`='".$club."'"; //$where .= " OR `club`='".mysql_real_escape_string($club)."'"; if($key==count($_REQUEST['club'] ) -1) $where.=")"; } $sql = "SELECT * from fa1 where 1".$where; print $sql; ?> <form> <input type="checkbox" name="gakunen[]" value="1年" />1年 <input type="checkbox" name="gakunen[]" value="2年" />2年 <input type="checkbox" name="gakunen[]" value="3年" />3年 <br /> <input type="checkbox" name="seibetsu[]" value="男" />男 <input type="checkbox" name="seibetsu[]" value="女" />女 <br /> <input type="checkbox" name="club[]" value="サッカー" />サッカー <input type="checkbox" name="club[]" value="野球" />野球 <input type="checkbox" name="club[]" value="バスケット" />バスケット <input type="checkbox" name="club[]" value="美術" />美術 <input type="submit" value="送信する" /> </form>
その他の回答 (1)
- t_ohta
- ベストアンサー率38% (5238/13705)
各foreachの前の変数定義を $arr1 = array("1=1"); $arr2 = array("1=1"); $arr3 = array("1=1"); としらたどうですか?
お礼
回答ありがとうございます。教えていただいた通りにしたら、全てのチェックを入れなかった場合の全データ表示はできました!ありがとうございます。 しかし、一つの項目のみチェックを入れた場合はデータが出てきません。1年にチェックを入れた場合の処理がどうなってるのか表示させたところ、 SELECT * from fa1 where (1=1orgakunen = '1年') and (1=1) and(1=1) となっています。 whereの後の部分(1=1orgakunen = '1年')でorgakunenとなってるあたりが問題なのかなぁと思い、クォーテーションでくくったりもしてみたのですが解決には至りませんでした。 このあたり、何かお気づきになりますでしょうか。
お礼
回答ありがとうございます。 教えていただいた通り書き換えて実行したら思うように動作しました。教えていただいた内容を読んでようやく概念が理解できました。 本当にありがとうございます!