
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のどれか一つでもチェックを空けるとデータが出てこない状態です。
それはソースを読んでも理解できるのですが、ここからどう変えていいかわからない状態です。色々過去の質問を見たり本で勉強したりはしたのですが、私の理解が足らず問題解決には至っていません。
どのようにすれば良いのか、何卒ご教授をお願いいたします。
No.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>
回答ありがとうございます。
教えていただいた通り書き換えて実行したら思うように動作しました。教えていただいた内容を読んでようやく概念が理解できました。
本当にありがとうございます!
No.1
- 回答日時:
各foreachの前の変数定義を
$arr1 = array("1=1");
$arr2 = array("1=1");
$arr3 = array("1=1");
としらたどうですか?
回答ありがとうございます。教えていただいた通りにしたら、全てのチェックを入れなかった場合の全データ表示はできました!ありがとうございます。
しかし、一つの項目のみチェックを入れた場合はデータが出てきません。1年にチェックを入れた場合の処理がどうなってるのか表示させたところ、
SELECT * from fa1 where (1=1orgakunen = '1年') and (1=1) and(1=1)
となっています。
whereの後の部分(1=1orgakunen = '1年')でorgakunenとなってるあたりが問題なのかなぁと思い、クォーテーションでくくったりもしてみたのですが解決には至りませんでした。
このあたり、何かお気づきになりますでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セッション関数を使わずにファ...
-
PHP8でWarning:Undefined varia...
-
PHP8を使うと、大量のWarningが...
-
composerをインストールしたい...
-
phpの問い合わせフォームを作っ...
-
SplFileObject を利用したとき...
-
BASIC認証のフォームをデザイン...
-
アップロードファイルを表示す...
-
$_SESSIONについて教えて下さい。
-
marginの値でマイナス値を設定...
-
ゆゆにゃ。
-
index.phpって何ですか? 具体...
-
ファイルアップロードに関して...
-
submitで思うようにページが遷...
-
HTML PHP ラジオボタンのイベント
-
php でqiitaのサイトにあったフ...
-
PHPの勉強してます。 配列のと...
-
[php初心者]サイトを見てデータ...
-
PHPでこのコード自体に意味は無...
-
reuterの記事をbeautiful.soup....
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
HTMLで前の画面に戻る時、入力...
-
配列をhiddenで
-
検索時の選択内容を保持する方法
-
DBの値をチェックボックスに反...
-
フォームボタンを押すたびに数...
-
PHPで、ボタンを押すと同じペー...
-
同じページでフォームデータを...
-
ラジオボタンをsessionで使いたい
-
フォームでのリセットを使う方法
-
POSTやGETの変数をフォーム無し...
-
HTMLフォームで複数選択のチェ...
-
PHPで画像の渡しが上手く行きま...
-
アップロードの際にファイルパス
-
テキストボックスに初期値を入れる
-
フォームへの前回入力値をクリ...
-
HTMLのリンクをクリックするこ...
-
フォームのテキストボックスに...
-
画面が更新されてもチェックボ...
-
<input type="hidden" >で配列...
-
PHP ボタンが押されたら処理を...
おすすめ情報