アプリ版:「スタンプのみでお礼する」機能のリリースについて

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文をベタ書きすることは十分可能だと思っています。

A 回答 (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
    • good
    • 0
この回答へのお礼

moon_nightさん、貴重レスありがとうございました。

>果物や肉類を種別テーブルとして別に作った方がいいような気がするのは置いといて。

わたしもDBをそのように設計すべきだと思いますが、
外注で作ったプログラムの改造で、もう後戻りできなくなっているのです。。。

ご提示いただいたサンプルで、要望はかないました。
implode というの、なかなか汎用性が高いですね。ありがとうございました。

お礼日時:2005/11/14 10:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!