• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:checkboxにチェックされた果物をOR条件で、さらに他の検索条件と)

checkboxにチェックされた果物をOR条件で、さらに他の検索条件と結ぶSQL文を発行

このQ&Aのポイント
  • 質問文章では、PHPとMySQLを使用して、checkboxにチェックされた果物をOR条件で結ぶSQL文を発行したいという要望があります。具体的には、好きな果物の登録が「ない」人を抽出するために、空白の人もマッチさせるSQL文を作成したいとのことです。
  • 質問文章内のソースコードには、果物のcheckboxと空白のチェックボックスが含まれており、これらの値を取り込んでSQL文に組み込む方法を知りたいと述べています。
  • また、質問者は教えてもらった回答を活用しており、すでに果物のcheckboxを使用したSQL文を作成済みであることが分かります。

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

>りんごが好きな人と「登録がない」人 あーなるほど、それは気がつきませんでした。 であれば、登録なしもkudamono[]で処理してみてはどうでしょう? <form> <p> 好きな果物 <input type="checkbox" name="kudamono[]" value="0" />りんご <input type="checkbox" name="kudamono[]" value="1" />みかん <input type="checkbox" name="kudamono[]" value="2" />ぶどう <input type="checkbox" name="kudamono[]" value="3" />ばなな </p> <p> 登録なし(空白の人もマッチさせる) <input type="checkbox" name="kudamono[]" value="" /> </p> <p> <input type="submit" name="exec" value="検索" /> </p> </form> <? $sql = "select * from mytable where myval1 =1 "; $kudamono=$_REQUEST["kudamono"]; if(is_array($kudamono)){ $sql.="AND `kudamono` IN ('".implode("','",$kudamono)."')"; }else{ $sql.="AND `kudamono` =''"; } print $sql; ?>

litton101
質問者

お礼

yamabejpさん、たびたびのご回答ありがとうございました。 まずはお礼が遅くなったことをお詫び申し上げます。 しばらく作業から遠ざかっていて、ようやく今日、戻ってこれました。 早速#2でご教示いただいた例を元に、こんな風に本番環境に組み込んだらばっちり 動作しました。感激しました。 <? $sql = "select * from mytable where myval1 =1 "; $kudamono=$_REQUEST["kudamono"]; if(is_array($_REQUEST["kudamono"])){ $sql.="AND `kudamono` IN ('".implode("','",$_REQUEST["kudamono"])."')"; } print $sql; ?> コードも大変短くなり、感謝感謝です。 本当にありがとうございました。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

いろいろ突っ込みどころがありますが・・・・ まずPHP_SELFは最近はNGとされていいます。SCRIPT_NAMEなどを利用してみてください。 さて、ロジックの問題ですが、orは冗長なのでINで処理してみては? また、チェックが何もない場合はチェックが無い人と考えればよいのでは? インジェクション対策は別途するとして、ざっとこんな感じでどうでしょう? <form action="<?=$_SERVER["SCRIPT_NAME"];?>"> <p> 好きな果物 <input type="checkbox" name="kudamono[]" value="0" />りんご <input type="checkbox" name="kudamono[]" value="1" />みかん <input type="checkbox" name="kudamono[]" value="2" />ぶどう <input type="checkbox" name="kudamono[]" value="3" />ばなな </p> <p> <input type="submit" name="exec" value="検索"> </p> </form> <? $sql = "select * from mytable where myval1 =1 "; $kudamono=$_REQUEST["kudamono"]; if(is_array($kudamono)){ $sql.="AND `kudamono` IN ('".implode("','",$kudamono)."')"; }else{ $sql.="AND `kudamono` =''"; } print $sql; ?>

litton101
質問者

お礼

yamabejpさん、いつもお世話になります。 ご回答にまずは御礼申し上げます。 > まずPHP_SELFは最近はNGとされていいます。SCRIPT_NAMEなどを利用してみてください。 そうでしたか。ご教示ありがとうございます。 「XSS脆弱性」なる記事がみつかりました。 > さて、ロジックの問題ですが、orは冗長なのでINで処理してみては? 確かに、こちらの方がスマートですね。ただ、 > また、チェックが何もない場合はチェックが無い人と考えればよいのでは? りんごが好きな人だけ抽出したければ、りんごだけにチェックしますし、 りんごとみかんが好きな人だけ抽出したければ、りんごとみかんだけにチェックすればいい。 しかし、りんごが好きな人と「登録がない」人を抽出したいとき、例示では対応できないのかな??と思いました。 あと、 > $_REQUEST["kudamono"]; $_POST["kudamono"];とか、$_GET["kudamono"];でなく、 $_REQUESTという方法もあるのですね。勉強になりました。

関連するQ&A