みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

何種類かのチェックボックスグループを検索フォームに追加したい

PHP 5、MySQL 4.0.14という組み合わせで、検索システムに挑戦中です。
入門書から動作まで確認できましたが、検索フォームにいくつかの
チェックボックスを追加したいです。

例えば、好きな果物を任意に選択させ、チェックされた果物をOR条件で、
さらに他の検索条件(住所等)とAND条件で結びたいです。

ここで、(1)HTML側と、(2)<?php ~~?>内に、
具体的にどのように記述したらよいものでしょうか。
例示はしてませんが好きな果物(3つのチェックボックスグループ)だけでなく、
好きな動物(6つの 〃 )や、好きな飲み物(2つの 〃 )など、様々な
チェックボックスを検索条件として絞り込めるようにしたいです。

---検索フォーム--
<FORM method="POST" action="list.php">
住所<input type="text" name="address"> を含む
好きな果物
<INPUT TYPE="CHECKBOX" NAME="kudamono">りんご
<INPUT TYPE="CHECKBOX" NAME="kudamono">みかん
<INPUT TYPE="CHECKBOX" NAME="kudamono">なし
<input type="submit" name="exec" value="検索">
</FORM>

---検索結果PHP--
require_once("dbini.php");
$con = mysql_connect($DBSERVER, $DBUSER, $DBPASSWORD);
$selectdb = mysql_select_db($DBNAME, $con);
$sql = "select * from t_mydata
where (address like '%$address%')
$sql .= " order by address";
$rst = mysql_query($sql, $con);
$body .= "<table>";
for ($recnum = 0; $recnum < $recmax; $recnum++) {
$body .= "<tr>";
$body .= "<td>" . $col["ADDRESS"] . "</td>";
$body .= "<td>" . $col["KUDAMONO"] . "</td>";
$body .= "</tr>";
}
$body .= "</table>";

# だいぶ省略してます。

投稿日時 - 2005-07-11 15:03:48

QNo.1506155

暇なときに回答ください

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

>同じようなチェックボックス形の検索条件を他にいくつか用意したいため、
>先頭行のSQL文はをご例示いたWHEREでなくANDに書き換えたのですが、
>この場合ひとつもチェックされていない場合にエラーになってしまいます。


checkboxならば

if(is_array($_POST['kudamono'])) {
print"チェックされてます";
}

とすればよいみたいですね。

投稿日時 - 2005-07-12 10:46:59

お礼

たびたびありがとうございました!

おかげさまで、完璧に要望を実現できました。
実はチェックボックスグループが10個くらいある
検索フォームなので
汎用性の高いものをご提示いただけた
おかげで、必要な部分がすぐにできあがりました。

本当に感謝にたえません。ありがとうございました。

投稿日時 - 2005-07-12 12:17:40

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

例えば
<INPUT TYPE="CHECKBOX" NAME="a">りんご
<INPUT TYPE="CHECKBOX" NAME="b">みかん
<INPUT TYPE="CHECKBOX" NAME="c">なし

として、
$sql = "select * from t_mydata";
$sql .= " where (";
$i=0; # 「or」 をつけるフラグ
if($_POST['a']) {
if ($i) {
$sql .= " or ";
}
$sql .= "果物 = 'りんご';
$i++;
}
if($_POST['b']) {
if ($i) {
$sql .= " or ";
}
$sql .= "果物 = 'みかん';
$i++;
}
if($_POST['c']) {
if ($i) {
$sql .= " or ";
}
$sql .= "果物 = 'なし';
$i++;
}
$sql .=")";

というような感じでやればいいかと思います。



<INPUT TYPE="CHECKBOX" NAME="kudamono[]" value="りんご">りんご
<INPUT TYPE="CHECKBOX" NAME="kudamono[]" value="みかん">みかん
<INPUT TYPE="CHECKBOX" NAME="kudamono[]" value="なし">なし

としておけば

foreach($_POST['kudamono'] as $fr) {
if ($i) {
$sql .= " or ";
}
$sql .= "果物 = '$fr';
$i++;
}

と省略できたりします。

条件が増えた場合はおんなじような感じで条件式を増やしてやればいいです。

投稿日時 - 2005-07-11 19:57:37

補足

ご教示ありがとうございました!
早速ためさせていただきましたが、すばらしいです。
条件が増えても対応できる省略形(配列というんですよね?)を使わせていただきました。

<INPUT TYPE="CHECKBOX" NAME="kudamono[]" value="りんご">りんご
<INPUT TYPE="CHECKBOX" NAME="kudamono[]" value="みかん">みかん
<INPUT TYPE="CHECKBOX" NAME="kudamono[]" value="なし">なし

$sql .= " and (";
$i=0; # 「or」 をつけるフラグ

foreach($_POST['kudamono'] as $fr) {
if ($i) {
$sql .= " or ";
}
$sql .= "果物 = '$fr'";
$i++;
}
$sql .=")";


完成形が以上の通りになりましたが、ひとつだけ追加質問よろしいでしょうか。
同じようなチェックボックス形の検索条件を他にいくつか用意したいため、
先頭行のSQL文はをご例示いたWHEREでなくANDに書き換えたのですが、
この場合ひとつもチェックされていない場合にエラーになってしまいます。
「AND()」というSQL文が生成されてしまうためです。

テキストボックスなら、次のように文字が入っている場合のみ検索対象にする、
みたいにできようですが、今回のチェックボックスの場合はどのようにかきかえたら
よろしいでしょうか。
if (strlen($hoge) > 0) {書き出したいSQL文}

どうぞ、よろしくお願い致します。

投稿日時 - 2005-07-12 10:13:17

あなたにオススメの質問