重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

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年
<input type="checkbox" name="gakunen[]" value="2年" />2年
<input type="checkbox" name="gakunen[]" value="3年" />3年<br />
<input type="checkbox" name="seibetsu[]" value="男" />男
<input type="checkbox" name="seibetsu[]" value="女" />女<br />
<input type="checkbox" name="club[]" value="サッカー" />サッカー
<input type="checkbox" name="club[]" value="野球" />野球
<input type="checkbox" name="club[]" value="バスケット" />バスケット
<input type="checkbox" name="club[]" value="美術" />美術
<input type="submit" value="送信する" />
</form>

私が得たい結果は、例えば学年で1年のチェックのみあった場合は性別、部活問わず1年生全てのデータ。
1年と3年とサッカーにチェックがあった場合には性別を問わず1年と3年のサッカーに所属しているデータ。
全てのチェックが無かった場合は全データ表示という具合にしたいのです。

現状は3つのカラム全てに該当するチェックをして、そのデータを表示させることしかできません。gakunen,seibetsu,clubのどれか一つでもチェックを空けるとデータが出てこない状態です。
それはソースを読んでも理解できるのですが、ここからどう変えていいかわからない状態です。色々過去の質問を見たり本で勉強したりはしたのですが、私の理解が足らず問題解決には至っていません。
どのようにすれば良いのか、何卒ご教授をお願いいたします。

A 回答 (2件)

これはテクニックがあります。



(1)全件表示は「WHERE 1」とします
(2)絞り込みをするときはANDでつなぎます
(3)同じカテゴリでやるときは0にORでつなぎます。
場合によってはINで処理してもよいでしょう。

なお、運用の際にはきちんとエスケープ処理をいれましょう。

<?php
$where="";
foreach((array) $_REQUEST['gakunen'] as $key=>$gakunen){
if($key==0) $where.=" AND (0";
$where .= " OR `gakunen`='".$gakunen."'";
//$where .= " OR `gakunen`='".mysql_real_escape_string($gakunen)."'";
if($key==count($_REQUEST['gakunen'] ) -1) $where.=")";
}
foreach((array) $_REQUEST['seibetsu'] as $key=>$seibetsu){
if($key==0) $where.=" AND (0";
$where .= " OR `seibetsu`='".$seibetsu."'";
//$where .= " OR `seibetsu`='".mysql_real_escape_string($seibetsu)."'";
if($key==count($_REQUEST['seibetsu'] ) -1) $where.=")";
}
foreach((array) $_REQUEST['club'] as $key=>$club){
if($key==0) $where.=" AND (0";
$where .= " OR `club`='".$club."'";
//$where .= " OR `club`='".mysql_real_escape_string($club)."'";
if($key==count($_REQUEST['club'] ) -1) $where.=")";
}
$sql = "SELECT * from fa1 where 1".$where;
print $sql;

?>


<form>
<input type="checkbox" name="gakunen[]" value="1年" />1年
<input type="checkbox" name="gakunen[]" value="2年" />2年
<input type="checkbox" name="gakunen[]" value="3年" />3年<br />
<input type="checkbox" name="seibetsu[]" value="男" />男
<input type="checkbox" name="seibetsu[]" value="女" />女<br />
<input type="checkbox" name="club[]" value="サッカー" />サッカー
<input type="checkbox" name="club[]" value="野球" />野球
<input type="checkbox" name="club[]" value="バスケット" />バスケット
<input type="checkbox" name="club[]" value="美術" />美術
<input type="submit" value="送信する" />
</form>
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
教えていただいた通り書き換えて実行したら思うように動作しました。教えていただいた内容を読んでようやく概念が理解できました。
本当にありがとうございます!

お礼日時:2011/11/25 13:30

各foreachの前の変数定義を


$arr1 = array("1=1");
$arr2 = array("1=1");
$arr3 = array("1=1");
としらたどうですか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。教えていただいた通りにしたら、全てのチェックを入れなかった場合の全データ表示はできました!ありがとうございます。

しかし、一つの項目のみチェックを入れた場合はデータが出てきません。1年にチェックを入れた場合の処理がどうなってるのか表示させたところ、
SELECT * from fa1 where (1=1orgakunen = '1年') and (1=1) and(1=1)
となっています。
whereの後の部分(1=1orgakunen = '1年')でorgakunenとなってるあたりが問題なのかなぁと思い、クォーテーションでくくったりもしてみたのですが解決には至りませんでした。
このあたり、何かお気づきになりますでしょうか。

お礼日時:2011/11/25 12:02

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