こんばんは。お世話になっております。
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);
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;
?>
moon_nightさま
こんばんは。まずはじめにご報告ですが、期待通りの結果を得る事が出来ました!有難う御座います。
ご丁寧にコードまで記載していただき、且つ他のサンプルコードまで記載していただき、とても参考になりました!有難う御座います。
言葉足らずでは御座いますが、「ありがとう」と、お礼の言葉を言うだけしかなく誠に心苦しいところではありますが、無事期待通りの結果を得る事が出来ました。有難う御座いました。
No.4
- 回答日時:
・データは、category(カテゴリ) と age(年齢)のデータを一つずつ持っている。
・チェック項目があり、チェックされた項目を表示させたい
まず検索項目として、(複数チェック可)
カテゴリ: □ドリンク □グルメ □ケーキ
年齢: □20代 □30代
とすると、例えばドリンクとグルメと20代と30代にチェックを入れているとカテゴリのドリンクとグルメの両方とも該当するデータはない(データにはカテゴリが一つしか登録されていないため)ので表示されません。
この場合、ドリンク+20代、ドリンク+30代、グルメ+20代、グルメ+30代のデータが出てくればいいということでしょうか?
いまいち仕様がはっきりしないので、補足をお願いします。
moon_nightさま
php504さま同様、早速のお返事に感謝いたします。
>両方とも該当するデータはない(データにはカテゴリが一つしか登録されていないため)ので表示されません。
なるほど・・・改めて考えさせられました。
>この場合、ドリンク+20代、ドリンク+30代、グルメ+20代、グルメ+30代のデータが出てくればいいということでしょうか?
はい!その通りです!説明が下手で申し訳ありません!
この場合、コードそのものが違ったものになるのでしょうか?
下のphp504様のヒントを基に・・とも考えておりますが、正直、(実際は4つの項目。50を数えるチェックボックス)迷路にはまった感があり、引き続きご指導頂けたら幸いです。
宜しくお願い致します。
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 と解釈されます)。
php504さま
早速のお返事有難う御座います!
なるほど、配列としての変数にもデータが複数あるとし、カッコで括るのですね。
知識が乏しく、変数が一つだけだったのでカッコで括る意味が判りませんでした。これらを踏まえて考えて見ます。有難う御座いました。
No.2
- 回答日時:
チェックしたもの全てが当てはまると言う意味でしょうか?
その場合でしたら、
$wherestr1 = implode(" OR ",$wherearr1);
$wherestr2 = implode(" OR ",$wherearr2);
を OR ではなく、 AND でやればいいと思います。
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);
このようなコードを設置しております。
何処がどう可笑しいのか、ご指摘頂けたら幸いです。
お忙しい中恐縮ですが、宜しくお願い致します。
No.1
- 回答日時:
ぱっと見た感じでは( )でくくったらどうかなと思いました
$sql = "select * from member where ($wherestr) AND ($wherestr1) order by date desc";
php504さま
お世話になっております。
只今、()で括ってみたところ、検索結果はチェックした項目に引っかかりませんでした。
それと、お恥ずかしい質問とは思いますが、この()で括る事によりどんな結果が返ってくるのですか?今後のためにとお伺いしたくて・・。
グーグルなどで検索してみましたが、キーワードが悪いのか、欲しい上を見つけることが出来ませんでした。お忙しい中恐縮ですが、お時間のあるときにでもお返事いただけたら幸いです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
準・究極の選択
「年収1000万円で一生カレーライス」か 「年収180万円で毎日何でも食べ放題」 あなたはどちらを選びますか?
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
チェックボックスによる検索(複数チェックの場合)
PHP
-
SQLの書き方(チェックボックス)
Oracle
-
php mysql でチェックボックスによる検索
PHP
-
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
HTMLで前の画面に戻る時、入力...
-
PHPでクリックするたびに変数を...
-
チェックボックスを用い、MySQL...
-
<input type="hidden" >で配列...
-
PHPでフォームデータをサンクス...
-
ラジオボタンをsessionで使いたい
-
検索後にチェックボックスのON/...
-
$_POSTを連想配列で取得したい!!
-
パラメーターを隠す
-
PHPで画像の渡しが上手く行きま...
-
入力した部分を表示させたまま...
-
【HTML(PHP?)】複数のフォーム...
-
フォームへの前回入力値をクリ...
-
POSTやGETの変数をフォーム無し...
-
連想配列の操作がうまくいかない
-
フォームのテキストボックスに...
-
phpの掲示板で新しい順に表...
-
至急!!教えてほしいです!!
-
【PHP】もし、「リセット」ボタ...
-
チェックボックスの値に応じてP...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
HTMLで前の画面に戻る時、入力...
-
<input type="hidden" >で配列...
-
PHP ボタンが押されたら処理を...
-
フォームへの前回入力値をクリ...
-
検索時の選択内容を保持する方法
-
PHPで画像の渡しが上手く行きま...
-
フォームボタンを押すたびに数...
-
syntax error, unexpected '}' ...
-
フォームでのリセットを使う方法
-
パラメーターを隠す
-
$_SESSIONについて教えて下さい。
-
ラジオボタンをsessionで使いたい
-
画面が更新されてもチェックボ...
-
phpの掲示板で新しい順に表...
-
PHPで、ボタンを押すと同じペー...
-
phpでの複数選択チェックボック...
-
PHPでじゃんけん勝負
-
チェックボックスを使った複数...
-
DBの値をチェックボックスに反...
-
PHPのmysqlに格納したデータの...
おすすめ情報