チェックボックスの値に応じてPHP内でSQLを発行する方法

このQ&Aのポイント
  • HTML検索フォームに複数のチェックボックスを設け、チェックが入った項目をORで結んだものと他の検索キーをANDで結ぶSQL文を発行する方法について教えてください。
  • 選択されたチェックボックスの値を使用し、MySQL内のレコードを条件に合致するか評価する方法について教えてください。
  • 果物・野菜・肉類というカテゴリのチェックボックスを考え、選択されたカテゴリに合致するレコードを抽出するためのロジックをPHPコードに組み込む方法について教えてください。
回答を見る
  • ベストアンサー

チェックボックスの値に応じてPHP内でSQLを発行する方法

HTML検索フォームにチェックボックスを複数設け、チェックが入ったら チェックされているもの同士をORで結んだものを、他の検索キーとANDで結ぶ SQL文を発行したいのですが。 これを効率的に行う方法を、以前に本掲示板でご教示いただきました。 <input type="checkbox" name="food[]" value="1">果物 <input type="checkbox" name="food[]" value="2">野菜 <input type="checkbox" name="food[]" value="3">肉類 if(is_array($_POST['food'])) { $sql .= " AND ("; $i=0; # 「or」 をつけるフラグ foreach($_POST['food'] AS $food_code) { if ($i) { $sql .= " OR "; } $sql .= "MYTABLE.MYFOOD = '$food_code'"; $i++; } $sql .=")"; } これを応用し、MySQLのMYTABLE.MYFOODに次のようなレコードが登録されているとして、 果物―みかん 野菜〔にんじん〕 野菜(キャベツ) 肉類【豚バラ】 果物~りんご  : これら先頭2文字を切り出して(あるいは「LIKE '肉類%'」のように、~で始まる、 でもいいです)真偽を評価したいです。 その際、果物と肉類にチェックが入ったと仮定して AND (SUBSTRING(MYTABLE.MYFOOD,1,4) = '果物' OR SUBSTRING(MYTABLE.MYFOOD,1,4) = '肉類') としてみたら、合致するものだけをうまく抽出できたのですが、 このようなロジックを冒頭のPHPコードに組み込むにはどう書いたらいいでしょうか? なお、果物5種類、野菜3種類、肉類7種類と、いずれも有限ですので、 SQL文をベタ書きすることは十分可能だと思っています。

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

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

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

果物や肉類を種別テーブルとして別に作った方がいいような気がするのは置いといて。 例です。 <input type="checkbox" name="food[]" value="果物"> <input type="checkbox" name="food[]" value="野菜"> <input type="checkbox" name="food[]" value="肉類"> として、 $sql .= "(SUBSTRING(MYTABLE.MYFOOD,1,4) = '"; $sql .= implode ("' OR SUBSTRING(MYTABLE.MYFOOD,1,4) = '",$_POST['food']); $sql .= ")"; と、こんな感じなのかなと思う次第ですがいかがでしょう。

参考URL:
http://php.s3.to/man/function.implode.html
litton101
質問者

お礼

moon_nightさん、貴重レスありがとうございました。 >果物や肉類を種別テーブルとして別に作った方がいいような気がするのは置いといて。 わたしもDBをそのように設計すべきだと思いますが、 外注で作ったプログラムの改造で、もう後戻りできなくなっているのです。。。 ご提示いただいたサンプルで、要望はかないました。 implode というの、なかなか汎用性が高いですね。ありがとうございました。

関連するQ&A

  • チェックに応じて違うチェックボックスをアクティブにしたい

    次のHTMLのように、大分類、小分類のような構成のチェックボックス グループがあります(初期設定は全部チェック無しです) 普段は[a][b][c][d]をdisableとしておき、(1) にチェックが入った 場合に[d]以外([a][b][c])アクティブ(?とにかくチェックを入れる ことができる)ようにするにはどうしたらいいでしょうか。 よろしくお願い致します。 <form id="Form1"> : <INPUT TYPE="CHECKBOX" NAME="food" value="果物">(1) 果物 <INPUT TYPE="CHECKBOX" NAME="food" value="野菜">(2) 野菜 <INPUT TYPE="CHECKBOX" NAME="food" value="肉魚">(3) 肉魚 <br> <INPUT TYPE="CHECKBOX" NAME="fruit" value="りんご">[a] りんご <INPUT TYPE="CHECKBOX" NAME="fruit" value="みかん">[b] みかん <INPUT TYPE="CHECKBOX" NAME="fruit" value="ぶどう">[c] ぶどう <INPUT TYPE="CHECKBOX" NAME="fruit" value="バナナ">[d] バナナ : </form>

  • phpでチェックボックスでの値の表示について

    HTMLで作成したテキスト、セレクト、チェックボックスなどに、選択されたもの全てをPOST送信で受け取って PHPにてパラメータをチェックしてから 確認画面(HTML)に表示してPHPにてDB登録するというプログラムを作ってます。 HTML側で <input type="checkbox" name="genre[0]" value="1" >国語 <input type="checkbox" name="genre[1]" value="2" >算数 <input type="checkbox" name="genre[2]" value="3" >理科  <input type="checkbox" name="genre[3]" value="4" >社会 として例えば、 <?php $genre = $_POST["genre"]; foreach ($genre as $key => $value){ print($value); } ?> で表示するとチェックした数字が表示されます。 (国語をチェックした場合 1) これを 国語 と表示させるにはどうすればいいんでしょうか? DBに登録する際は数字でいいんですが。

    • ベストアンサー
    • PHP
  • チェックボックスの返す値

    <INPUT type="checkbox" name="check_1" value="1"> という記述だと、 チェックあるとき→1 チェックないとき→(空白) となりますよね。 チェックあるとき→1 チェックないとき→0 にしたいときはどうすればよろしいのでしょうか?

    • ベストアンサー
    • CGI
  • CGIでチェックボックスを使う方法

    チェックボックスをCGI(C言語)で使用する方法を教えて下さい。 例えば、HTMLで <input type="checkbox" name="Check1" value="Sel11" /> チェック1 選択1<br /> <input type="checkbox" name="Check1" value="Sel12" /> チェック1 選択2<br /> <input type="checkbox" name="Check1" value="Sel13" /> チェック1 選択3 <hr /> <input type="checkbox" name="Check2" value="Sel21" checked /> チェック2 選択1<br /> <input type="checkbox" name="Check2" value="Sel22" /> チェック2 選択2<br /> <input type="checkbox" name="Check2" value="Sel23" checked /> チェック2 選択3 というプログラムはCGI(C言語)ではどの様に記述すれば良いでしょうか?

    • ベストアンサー
    • CGI
  • 複数のチェックボックスをチェックしたい

    質問させてください。 複数のチェックボックスを項目別に全てチェックするようなjqueryの書き方をご教授いただきたいです。 <table> <tr> <td> <input type="checkbox" name="" />まとめてチェック </td> </tr> <tr> <td> <li><input type="checkbox" name="" value="" />a</li> <li><input type="checkbox" name="" value="" />b</li> <li><input type="checkbox" name="" value="" />c</li> <li><input type="checkbox" name="" value="" />d</li> </td> </tr> <tr> <td> <input type="checkbox" name="" />まとめてチェック </td> </tr> <tr> <td> <li><input type="checkbox" name="" value="" />e</li> <li><input type="checkbox" name="" value="" />f</li> <li><input type="checkbox" name="" value="" />g</li> <li><input type="checkbox" name="" value="" />h</li> </td> </tr> <tr> <td> <input type="checkbox" name="" />まとめてチェック </td> </tr> <tr> <td> <li><input type="checkbox" name="" value="" />i</li> <li><input type="checkbox" name="" value="" />j</li> <li><input type="checkbox" name="" value="" />k</li> <li><input type="checkbox" name="" value="" />l</li> </td> </tr> </table> 上記のようにそれぞれの項目に「まとめてチェック」のチェックボックスがあり、 そこに該当するチェック項目は全てチェックorチェックを外す っという挙動の実装を考えています。 jqueryでやりたいのですが、javascript、jqueryがかなり苦手でいまいちいきません。 ググって $(function(){ $('#all').click(function(){ if(this.checked){ $('#check input').attr('checked','checked'); }else{ $('#check input').removeAttr('checked'); } }); }); このソースを見つけたのですが、これだと一つの項目でしか実装できず 項目分このjqueryを書くのも余り良い書き方だと思えません。 どなたか、ご教授お願いいたします。

  • チェックボックスの全選択

    <input type="checkbox" name="chk" value=1> <input type="checkbox" name="chk" value=2> <input type="checkbox" name="chk" value=3> <input type="checkbox" name="chk" value=4> <input type="checkbox" name="chk" value=5> このように同一名称のチェックボックスに対して ボタンを押下された時全てのチェックボックスを チェックするJavaScriptの 書き方を教えて貰えないでしょうか

  • チェックボックスの戻り

    チェックボックスのvalue値に数字を入れてPOSTしています。 DB登録の前にその値を足し算してDBに登録しています。 <input type="checkbox" name="cb[0]" value="1"> <input type="checkbox" name="cb[1]" value="2"> <input type="checkbox" name="cb[2]" value="4"> <input type="checkbox" name="cb[3]" value="8"> <input type="checkbox" name="cb[4]" value="16"> ・・・のようにしています。DBの値を読み取ってcheckedを付ける際はどのようにしたら効率よく処理できるでしょうか?switchを使うとすごくチェックボックスの数が増えると厄介です。困っています。教えてください。

    • ベストアンサー
    • PHP
  • チェックボックスをクリックした際、自動的に他の値も

    ■チェックボックスをクリックした際、自動的に他の値も追加したい 下記のようなチェックボックスがあった際に、 <input type="checkbox" name="hoge[]" value="1" />ホゲ  <input type="checkbox" name="piyo[]" value="1" />ピヨ  <input type="checkbox" name="puyo[]" value="1" />プヨ  ホゲをクリックしたら、value="1"になるかと思うのですが、 このvalue部分を動的に生成することはできるでしょうか? 例えば、ホゲをクリックしたら(ホゲをクリックした時だけ)、 自動的に、 <input type="checkbox" name="hoge[]" value="1" /> <input type="checkbox" name="hoge[]" value="2" /> <input type="checkbox" name="hoge[]" value="3" /> <input type="checkbox" name="hoge[]" value="4" /> <input type="checkbox" name="hoge[]" value="5" /> <input type="checkbox" name="hoge[]" value="6" /> <input type="checkbox" name="hoge[]" value="7" /> <input type="checkbox" name="hoge[]" value="8" /> <input type="checkbox" name="hoge[]" value="9" /> をクリックしたのと同じ処理が走るよう、スクリプトで書くには、 どうすればよいでしょうか?

  • チェックボックスのチェックについて

    submit時に一つでもチェックがなければアラートを表示 チェックがあれば進む・・・としたいです。 <form action=next.html name=form1> <input type=checkbox name=checkbox1 value=1> <input type=checkbox name=checkbox2 value=2> <input type=checkbox name=checkbox3 value=3> <input type=checkbox name=checkbox4 value=4> <input type=checkbox name=checkbox5 value=5> ~以下50まで続きます <input type=submit value=submit> </form> function countChecked(form1) { var total = 0; var max = 50; for (var index = 0; index < form1.checkbox.length; index++) { total += form1.checkbox[index].checked ? 1 : 0; } if(countChecked(document.form1)) > 0) { return true; } else { alert("no"); return false; } return(total); } 過去に似たような質問を参考に作ってみましたがダメでした。 チェックボックスの名前の付け方が悪いのでしょうか。

  • 複数のチェックボックス項目があり、そのチェック状態によって

    複数のチェックボックス項目があり、そのチェック状態によって 処理を分岐したいのですが、スマートなjavascriptの書き方が あれば教えてください! 【例】 <input type="checkbox" name="koumokuA" value="A1" /> <input type="checkbox" name="koumokuA" value="A2" /> <input type="checkbox" name="koumokuA" value="A3" /> <input type="checkbox" name="koumokuA" value="A4" /> <input type="checkbox" name="koumokuA" value="A5" /> <input type="checkbox" name="koumokuB" value="B1" /> <input type="checkbox" name="koumokuB" value="B2" /> <input type="checkbox" name="koumokuB" value="B3" /> <input type="checkbox" name="koumokuB" value="B4" /> <input type="checkbox" name="koumokuC" value="C1" /> <input type="checkbox" name="koumokuC" value="C2" /> <input type="checkbox" name="koumokuC" value="C3" /> <input type="checkbox" name="koumokuC" value="C4" /> もし【koumokuA】のA2とA3、【koumokuB】のB1とB4が選択された場合 同項目ではor条件、他項目ではand条件で処理したいので 考え方としては、 if(koumokuA=="A2" || koumokuA=="A3"){ if(koumokuB=="B1" || koumokuB=="B4"){ 実行内容 } } こんな感じなのですが、 実際にはチェックボックスの値は配列になるのでこのスクリプトでは動かない点と 効率よく複数のチェックボックスの選択結果を判定して、スクリプトを実行する 組み方があればご教授ください。 実行結果は、データが格納された配列の中から、選択項目に対応したデータを 表示するようにしたいのです。 よろしくお願いします。

専門家に質問してみよう