• ベストアンサー

チェックボックスによる検索

こんばんは。お世話になっております。 PHPにてDB(MySQL)に登録されたデータをチェックボックスのみで検索するスクリプトを組んでおりますが、チェックボックスの数が多数あり、混乱してしまい、お力をお借りしたく投函させて頂きました。 上手く説明できるかどうか判りませんが… まず検索項目として、(複数チェック可) カテゴリ: □ドリンク □グルメ □ケーキ 年齢:   □20代  □30代 以上のようなフォームを用意しており、各チェックボックスのnameはDBのフィールドを同じ名前。valueは実際に登録されている数値を記述しています。 そこで、上記チェックボックスにいくつかのチェックを入れ、検索すると、それに該当するものだけを検索結果として一覧表示させたいのですが、現在、全ての項目に当てはまるものと一緒に、1つでも含んだデータまでもが表示されてしまいます。 お忙しい中恐縮ですが、お知恵を頂戴出来ればと考えております。 宜しくお願い致します。 //POSTで受け取ったデータを配列にし、 foreach($arr as $category){ $wherearr1[] = " ( category = '$category' )" } foreach($arr as $category){ $wherearr2[] = " ( age = '$age' )" } $wherestr1 = implode(" OR ",$wherearr1); $wherestr2 = implode(" OR ",$wherearr2); $sql = "select * from member where $wherestr AND $wherestr1 order by date desc"; $result = mysql_query($sql);

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

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

どっちもチェックされていることが前提で。 <form> <b>カテゴリ</b><br> <input type="checkbox" name="cate[]" value="1">ドリンク<br> <input type="checkbox" name="cate[]" value="2">グルメ<br> <input type="checkbox" name="cate[]" value="3">ケーキ<br> <br> <b>年齢</b><br> <input type="checkbox" name="age[]" value="10">10代<br> <input type="checkbox" name="age[]" value="20">20代<br> <br> <input type="submit"> <input type="hidden" name="aaa" value="aaa"> </form> <?PHP $arr1 = array(); foreach($_GET['cate'] as $cate){ $arr1[] = " category = '$cate' "; } $arr2 = array(); foreach($_GET['age'] as $age){ $arr2[] = " age = '$age' "; } $a = implode(" OR ",$arr1); $b = implode(" OR ",$arr2); $sql = "select * from member where ($a) AND ($b) order by date desc"; print $sql; ?> 修正してみて思ったのですが、二つとも「$arr as $category」だったり、 使用された形跡がない変数「 $wherestr 」が使われていたりします。 あとは、 $a = implode(",",$_GET['cate']); として、 category in ($a) とかやってみたりしてもいいでしょう。 <?PHP $a = implode(",",$_GET['cate']); $b = implode(",",$_GET['age']); $sql = "select * from member where category in ($a) AND age in ($b) order by date desc"; print $sql; ?>

sadacha
質問者

お礼

moon_nightさま こんばんは。まずはじめにご報告ですが、期待通りの結果を得る事が出来ました!有難う御座います。 ご丁寧にコードまで記載していただき、且つ他のサンプルコードまで記載していただき、とても参考になりました!有難う御座います。 言葉足らずでは御座いますが、「ありがとう」と、お礼の言葉を言うだけしかなく誠に心苦しいところではありますが、無事期待通りの結果を得る事が出来ました。有難う御座いました。

その他の回答 (4)

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

・データは、category(カテゴリ) と age(年齢)のデータを一つずつ持っている。 ・チェック項目があり、チェックされた項目を表示させたい まず検索項目として、(複数チェック可) カテゴリ: □ドリンク □グルメ □ケーキ 年齢:   □20代  □30代 とすると、例えばドリンクとグルメと20代と30代にチェックを入れているとカテゴリのドリンクとグルメの両方とも該当するデータはない(データにはカテゴリが一つしか登録されていないため)ので表示されません。 この場合、ドリンク+20代、ドリンク+30代、グルメ+20代、グルメ+30代のデータが出てくればいいということでしょうか? いまいち仕様がはっきりしないので、補足をお願いします。

sadacha
質問者

お礼

moon_nightさま php504さま同様、早速のお返事に感謝いたします。 >両方とも該当するデータはない(データにはカテゴリが一つしか登録されていないため)ので表示されません。 なるほど・・・改めて考えさせられました。 >この場合、ドリンク+20代、ドリンク+30代、グルメ+20代、グルメ+30代のデータが出てくればいいということでしょうか? はい!その通りです!説明が下手で申し訳ありません! この場合、コードそのものが違ったものになるのでしょうか? 下のphp504様のヒントを基に・・とも考えておりますが、正直、(実際は4つの項目。50を数えるチェックボックス)迷路にはまった感があり、引き続きご指導頂けたら幸いです。 宜しくお願い致します。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

うーん、だめでしたか 括弧でくくるのは a OR b OR c AND d OR e OR f と (a OR b OR c) AND (d OR e OR f) の違いです。 前者はa, b, e, fの場合は単独で引っかかります(a OR b OR (c AND d) OR e OR f と解釈されます)。

sadacha
質問者

お礼

php504さま 早速のお返事有難う御座います! なるほど、配列としての変数にもデータが複数あるとし、カッコで括るのですね。 知識が乏しく、変数が一つだけだったのでカッコで括る意味が判りませんでした。これらを踏まえて考えて見ます。有難う御座いました。

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

チェックしたもの全てが当てはまると言う意味でしょうか? その場合でしたら、 $wherestr1 = implode(" OR ",$wherearr1); $wherestr2 = implode(" OR ",$wherearr2); を OR ではなく、 AND でやればいいと思います。

sadacha
質問者

お礼

moon_nightさま お世話になっております。 只今、ORと変更してみましたが、期待する結果は返ってきませんでした。 上手く説明できないのですが、DBに登録してあるデータは、「ドリンクと20代」と登録してあるのもあれば、「ドリンクと30代」、「ワインと20代」と、1つのカテゴリに対し1つだけ登録されており、フォームにてチェックを付けて検索した際、項目に該当するテーブルだけを検索結果として表示させたいと考えています。 ちなみに、現在のコードは、投函時に記載したコードの上に、 if(isset($_POST["category"]) AND isset($_POST["age"])){ $category=implode(' ',$_POST["category"]); $age=implode(' ',$_POST["age"]); $category = addslashes($category); $category = mb_convert_encoding($category, 'EUC-JP', 'auto'); $category = mb_ereg_replace(" ", " ", $category); $arr = explode(" ",$category); $age = addslashes($age); $age = mb_convert_encoding($age, 'EUC-JP', 'auto'); $age = mb_ereg_replace(" ", " ", $age); $arr4 = explode(" ",$age); このようなコードを設置しております。 何処がどう可笑しいのか、ご指摘頂けたら幸いです。 お忙しい中恐縮ですが、宜しくお願い致します。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

ぱっと見た感じでは( )でくくったらどうかなと思いました $sql = "select * from member where ($wherestr) AND ($wherestr1) order by date desc";

sadacha
質問者

お礼

php504さま お世話になっております。 只今、()で括ってみたところ、検索結果はチェックした項目に引っかかりませんでした。 それと、お恥ずかしい質問とは思いますが、この()で括る事によりどんな結果が返ってくるのですか?今後のためにとお伺いしたくて・・。 グーグルなどで検索してみましたが、キーワードが悪いのか、欲しい上を見つけることが出来ませんでした。お忙しい中恐縮ですが、お時間のあるときにでもお返事いただけたら幸いです。

関連するQ&A