• ベストアンサー

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

こんばんは。お世話になっております。 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);

  • PHP
  • 回答数5
  • ありがとう数5

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

  • ベストアンサー
  • 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

  • チェックボックス検索システム

    <?PHP $con = mysql_connect('******.jp', '*********', '******'); if (!$con) { exit('データベースに接続できませんでした。'); } $result = mysql_select_db('******', $con); if (!$result) { exit('データベースを選択できませんでした。'); } $result = mysql_query('SET NAMES utf8', $con); if (!$result) { exit('文字コードを指定できませんでした。'); } $arr1 = array(); foreach($_POST['tiiki'] as $tiiki){ $arr1[] = " tiiki = '$tiiki' "; } $arr2 = array(); foreach($_POST['syoku'] as $syoku){ $arr2[] = " syoku = '$syoku' "; } $arr3 = array(); foreach($_POST['koyou'] as $koyou){ $arr3[] = " koyou = '$koyou' "; } $a = implode(" OR ",$arr1); $b = implode(" OR ",$arr2); $c = implode(" OR ",$arr3); $sql = "select * from kensaku where ($a) AND ($b)AND ($c) order by date desc"; print $sql; ?> <?php $con = mysql_connect('*****.jp', '******', '******'); if (!$con) { exit('データベースに接続できませんでした。'); } $result = mysql_select_db('*******', $con); if (!$result) { exit('データベースを選択できませんでした。'); } $result = mysql_query('SET NAMES utf8', $con); if (!$result) { exit('文字コードを指定できませんでした。'); } $result = mysql_query('SELECT * FROM kensaku', $con); while ($data = mysql_fetch_array($result)) { echo '<p>' . $data['tiiki'] . ':' . $data['syoku'] . ':' . $data['koyou'] . ':' . $data['kai'] . "</p>\n"; } $con = mysql_close($con); if (!$con) { exit('データベースとの接続を閉じられませんでした。'); } ?> これで表示されるのが、 select * from kensaku where ( tiiki = '豊岡市' ) AND ( syoku = '飲食' )AND ( koyou = 'バイト' ) order by date desc 豊岡市:飲食:バイト:オシイそば 豊岡市:製造:正社員:オシイ運輸 養父市:飲食:バイト:オシイ物産 です。一番目のphpデータはPOST文を受け取っただけでデータベース内から検索してくれないし、二番目のphpデータはデータべスにある情報を全て受け取っただけです。 僕はチェックされた情報をPOSTで受け取り、チェックされた内容に該当するデータだけデータベースから受け取り表示させたいんですが、どうすればいいですか?

    • ベストアンサー
    • PHP
  • チェックボックス検索システム

    <?PHP $con = mysql_connect('******.jp', '*********', '******'); if (!$con) { exit('データベースに接続できませんでした。'); } $result = mysql_select_db('******', $con); if (!$result) { exit('データベースを選択できませんでした。'); } $result = mysql_query('SET NAMES utf8', $con); if (!$result) { exit('文字コードを指定できませんでした。'); } $arr1 = array(); foreach($_POST['tiiki'] as $tiiki){ $arr1[] = " tiiki = '$tiiki' "; } $arr2 = array(); foreach($_POST['syoku'] as $syoku){ $arr2[] = " syoku = '$syoku' "; } $arr3 = array(); foreach($_POST['koyou'] as $koyou){ $arr3[] = " koyou = '$koyou' "; } $a = implode(" OR ",$arr1); $b = implode(" OR ",$arr2); $c = implode(" OR ",$arr3); $sql = "select * from kensaku where ($a) AND ($b)AND ($c) order by date desc"; print $sql; ?> <?php $con = mysql_connect('*****.jp', '******', '******'); if (!$con) { exit('データベースに接続できませんでした。'); } $result = mysql_select_db('*******', $con); if (!$result) { exit('データベースを選択できませんでした。'); } $result = mysql_query('SET NAMES utf8', $con); if (!$result) { exit('文字コードを指定できませんでした。'); } $result = mysql_query('SELECT * FROM kensaku', $con); while ($data = mysql_fetch_array($result)) { echo '<p>' . $data['tiiki'] . ':' . $data['syoku'] . ':' . $data['koyou'] . ':' . $data['kai'] . "</p>\n"; } $con = mysql_close($con); if (!$con) { exit('データベースとの接続を閉じられませんでした。'); } ?> これで表示されるのが、 select * from kensaku where ( tiiki = '豊岡市' ) AND ( syoku = '飲食' )AND ( koyou = 'バイト' ) order by date desc 豊岡市:飲食:バイト:オシイそば 豊岡市:製造:正社員:オシイ運輸 養父市:飲食:バイト:オシイ物産 です。一番目のphpデータはPOST文を受け取っただけでデータベース内から検索してくれないし、二番目のphpデータはデータべスにある情報を全て受け取っただけです。 僕はチェックされた情報をPOSTで受け取り、チェックされた内容に該当するデータだけデータベースから受け取り表示させたいんですが、どうすればいいですか?非常に困っています!!!!!!!!!!!!!!!!!!!!!!!!!

  • チェックボックスを使っての検索で

    PHP5とMySQL4.0.24を使用しています。 フィールド内にカンマ区切りでテキストが格納されてます。 +----+----------------------+ | ID | text | +----+----------------------+ |id01| 101,001,201,300 | |id02| 001,201,105 | |id03| 101,401,300,201,003 | | : | : | +----+----------------------+ これをチェックボックスで □001 □003 □101 □105 □201 … でOR検索をしたいのですが。 検索側のHTMLで <input type=checkbox name=chk[] value=001>001         : と書いて 処理側のPHPに $arraival = is_array(@$_POST['chk'])? implode(',',$_POST['chk']):'empty case'; $sql = "select * from shop_data where arraival like '%$arraival%'"; としてもうまく結果が得られません。 どの様に書けばよいのでしょうか?

    • ベストアンサー
    • MySQL
  • GETで渡す配列に関して

    こんばんは。お世話になっております。 早速ですが、DB内のデータを複数あるチェックボックス(name="category[]"など)を用いて、別ファイルにGETでデータを送り、検索結果を表示させているのですが、データ量が多いため、表示させるデータ数を一定にし、「次のページへ」とリンクを張ることで前後のページに移動できるよう考えています。 そこで、今回躓いたのが、検索フォームから渡された配列のデータ(チェックボックス)を、次ページへ移動させる際、どのような記述になるのでしょうか? 当たり前でしょうが、検索実行ファイルに渡されたデータをそのまま($category=$_GET["category"];)リンクに貼り付けても上手く行かず、 $category_box = implode(' ',$_GET["category"]); $arr1 = explode(" ",$category_box); foreach($arr1 as $category_box){ $wherearr1[] = "category like '%$category_box%'";} として、配列に戻してから・・などとも思ってはいるのですが、全て上手くいくことが出来ません。 お忙しい中恐縮ですが、アドバイスなど頂けたら幸いに思います。宜しくお願い致します。

    • ベストアンサー
    • PHP
  • phpのチェックボックスによる絞込みについて

    PHPとSQLでチェックボックスを使って、複数条件によるデータを抽出するというものを作っています。 データベースの検索対象となるカラムが、以下の様にbakunen,seibetsu,clubとあります。 ―――――――――――――――――――― gakunen   seibetsu   club ―――――――――――――――――――― 1年   男 サッカー 1年   男  野球 2年   女  バスケット 2年   男  野球 3年   女  美術 3年   男  バスケット 3年   女  バスケット チェックボックス側は、 学年:1年□ 2年□ 3年□ 性別:男□ 女□ 部活:サッカー□ 野球□ バスケット□ 美術□ としています。 phpのソースは以下の通りにしています。(一部抜粋) <?php $arr1 = array(); foreach($_POST['gakunen'] as $gakunen){ $arr1[] = "gakunen = '$gakunen'"; } $arr2 = array(); foreach($_POST['seibetsu'] as $seibetsu){ $arr2[] = "seibetsu = '$seibetsu'"; } $arr3 = array(); foreach($_POST['club'] as $club){ $arr3[] = "club = '$club'"; } $a = implode("or" , $arr1); $b = implode("or" , $arr2); $c = implode("or" , $arr3); $query = "SELECT * from fa1 where ($a) and ($b) and ($c)"; $result = mysql_query($query, $link); if (!$result) { echo 'データエラー'; } else { echo '<p>該当した検索結果:<br />'; while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { echo h($row['gakunen']) . ' : ' . h($row['seibetsu']) . ' : ' . h($row['club']) . '<br />'; } echo '</p>'; } } ?> <form method="post" action=""> <input type="checkbox" name="gakunen[]" value="1年" />1年&nbsp; <input type="checkbox" name="gakunen[]" value="2年" />2年&nbsp; <input type="checkbox" name="gakunen[]" value="3年" />3年&nbsp;<br /> <input type="checkbox" name="seibetsu[]" value="男" />男&nbsp; <input type="checkbox" name="seibetsu[]" value="女" />女&nbsp;<br /> <input type="checkbox" name="club[]" value="サッカー" />サッカー&nbsp; <input type="checkbox" name="club[]" value="野球" />野球&nbsp; <input type="checkbox" name="club[]" value="バスケット" />バスケット&nbsp; <input type="checkbox" name="club[]" value="美術" />美術&nbsp; <input type="submit" value="送信する" /> </form> 私が得たい結果は、例えば学年で1年のチェックのみあった場合は性別、部活問わず1年生全てのデータ。 1年と3年とサッカーにチェックがあった場合には性別を問わず1年と3年のサッカーに所属しているデータ。 全てのチェックが無かった場合は全データ表示という具合にしたいのです。 現状は3つのカラム全てに該当するチェックをして、そのデータを表示させることしかできません。gakunen,seibetsu,clubのどれか一つでもチェックを空けるとデータが出てこない状態です。 それはソースを読んでも理解できるのですが、ここからどう変えていいかわからない状態です。色々過去の質問を見たり本で勉強したりはしたのですが、私の理解が足らず問題解決には至っていません。 どのようにすれば良いのか、何卒ご教授をお願いいたします。

    • ベストアンサー
    • PHP
  • チェックボックスで受け取った値のPDOでの使い方

    現在PHPとSQLを使ってHPを作ろうとしている初心者です。 似たような質問は多くネットで見受けられるのですがうまくいかず悩んでます。 初歩的な質問で恐縮ですがご協力をお願いいたします。 やろうとしていることは、チェックボックスで選択された項目をMYSQLでSELECT文で抽出するというものです。 以下、現在作成中のプログラム(一部抜粋)です。 <?php $stcd=$_POST["stcd"];  ←ここでチェックボックスの値を受け取っているつもりですが、配列の観点をのちのSQL文含めどのように織り込めば良いかがわかりません。 $db = new PDO("mysql:host=localhost;dbname=".$dbname,$username,$password); $sql="SELECT * FROM property WHERE stcd ={$stcd}"; $res=$db->query($sql); $rows=$res->fetchAll(PDO::FETCH_ASSOC); echo '<br />検索結果は'.$res->rowCount().'件です<br/>'; foreach($rows as $r){ echo '<td>'.$r['price'].'円</td>'; echo '<td>'.$r['stname'].'</td>'; } ?> チェックボックスの受け取り方が明らかにこれではできないとわかってはいるのですが、解決策がさっぱりわかりません。 ご協力をお願いいたします。

    • ベストアンサー
    • PHP
  • チェックボックスで渡ってきたデータを一つのフィールド(や変数)で処理したい

    特にPHPに限った質問というわけではないのですが、複数のチェックボックスからのデータをmySQLにためて、ユーザーが検索できるプログラムを作っています。 チェックボックスの数があまり多くないので、項目ごとにフィールドを追加してやってもいいのですが、あまりスマートではないし、後で項目の追加があった場合に対応できないので、一つのフィールドにすべてのチェックボックスのデータを納めたいと思っています。 一般的にこのような場合、どのように処理するのでしょうか? 方法を考えたのですが、チェックボックスのvalueに value=1 value=2 value=4 value=8・・・として、チェックがある項目は全部足して2進数に変換してDBに登録し、(例えば、value=1とValue=8にチェックがあったら9となり、2進数では1001でonが判別できます)ユーザーが検索するときには同じく検索条件を2進数に変換して論理積で1以上のものを抜き出せば自分の想像通りの動きはしそうです。 ただ、DBから抜き出すときにいちいち論理積でパターンマッチしたものを抜き出す必要があるので、あまり高速ではない(?)&SQL文一発で書けないのでちょっと処理が面倒かなと思っています。 ちょっと説明がうまくできなくてわかりづらいとは思いますが、何かいい方法はないでしょうか?

    • ベストアンサー
    • PHP
  • ループでチェックボックスにcheckedを入れたい

    昨日質問させて頂きました件は、上手く行きました。ありがとうございました。また、行き詰ってしまったのでよろしくお願いいたします。 $intersectという配列があります。中身はarray(20,22)です。 データベースのテーブルから、fetch_arrayですべてを取り出し、 この値と同じである場合、チェックボックスにチェックを入れたいと考えています。 しかし、最後の値しかチェックボックスにチェックが入りません。どうかよろしくお願いいたします。 ********************************************************** $sql = "SELECT * FROM option_name"; $res = mysql_query($sql, $conn) or die("データ抽出エラー"); while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) {  $subject = $row["subject"];//題名  $option_no = $row["opno"];//プランNO foreach ($intersect as $value){  if($value == $option_no){   $checked = "checked";   }else{   $checked = " "; } } $op_subject .= "<input type='checkbox' name='subject[]' value='$option_no' $checked>$option_no$subject<br>"; } print $op_subject;

    • ベストアンサー
    • PHP
  • checkbokとキーワード検索を組み合わせた検索

    PHP4とMySQL4.0.22を使っています。 チェックボックスとキーワードで検索結果を表示させたいと思い。 下記のようにプログラムを作成したのですが、うまく検索表示してくれません。 PHPもMySQLも初心者なため、あちこちの構文を寄せ集めたため、Parseもうまく通っていません。 どこをどういう風にすればうまくいくのか、教えていただけないでしょうか? よろしくお願いします。 ----------------------------以下PHPファイル----------- 検索フォーム 検索キーワード:<input type=text name=\"k\"value='$k' size=45 > チェックボックス <INPUT TYPE=\"CHECKBOX\" NAME=\"bumon[]\" value=\"01:河川・砂防及び海岸\">01:河川・砂防及び海岸 ・・ "; //データ検索結果の実行部分 if($sig=="kb"){ $wk ==""; if($wk<>""){ //チェックボックス $sql = "select * from tecris where"; $sql .= " ("; $i=0; foreach($_POST['bumon'] as $fr) { if ($i) { $sql .= " or "; } $sql .= "bumon = '$fr'; $i++; } $sql .= ") and "; //キーワード if($k<>""){ $xk = str_replace(" "," ",$k); $gk = explode(" ",$xk); $wk ="keyword like '%$gk[0]%'"; $i = 1; $n = count($gk) - 1; while ($i <= $n){ $wk = $wk . " and keyword like '%$gk[$i]%'"; $i++; } } //クエリの作成 $sql = $sql . $wk; };

    • 締切済み
    • PHP
  • チェックボックスの使い方

    VBスクリプトでよくわからないところがあるので教えてください。たくさんのチェックボックスがあるので、For i To ~Next の構文を使って効率よくチェックされたものだけSQLの構文に取り入れて検索しようとしたのですがうまくゆきません。どのようにしたらよいでしょうか。 今試してみたのは、検索条件の設定画面で、 <input type=checkbox name=tatemono(0) value=自社使用>自社使用 <input type=checkbox name=tatemono(1) value=事業用>事業用 <input type=checkbox name=tatemono(2) value=電算センター >電算センター というようなチェックボックスを 検索処理用ページで SQL="SELECT * FROM [データ] " 'チェックボックスのチェック数が0でなければWHERE文をいれるflagをTrueにしておく If Request.Form("tatemono").Count>0 Then SQL=SQL & "WHERE " flag=True End If 'チェックボックスを最初から調べてチェックされていたらその項目がyesになっているという条件をSQL文に追加する For i=1 To Request.Form("tetemono").Count If Request.Form("tatemono")(i)<>"" Then fldname=Request.Form("tetemono")(i) If flag=True Then SQL = SQL & "AND" Else SQL = SQL & "WHERE" End If SQL= SQL & fldname & "=Yes" End If Next とやってみたのですが、ぜんぜん駄目みたいです。 根本的にどこか間違ってますよね・・・。 直すところを教えてください。 お願いします。