チェックボックスによる検索
こんばんは。お世話になっております。
PHPにてDB(MySQL)に登録されたデータをチェックボックスのみで検索するスクリプトを組んでおりますが、チェックボックスの数が多数あり、混乱してしまい、お力をお借りしたく投函させて頂きました。
上手く説明できるかどうか判りませんが…
まず検索項目として、(複数チェック可)
カテゴリ: □ドリンク □グルメ □ケーキ
年齢: □20代 □30代
以上のようなフォームを用意しており、各チェックボックスのnameはDBのフィールドを同じ名前。valueは実際に登録されている数値を記述しています。
そこで、上記チェックボックスにいくつかのチェックを入れ、検索すると、それに該当するものだけを検索結果として一覧表示させたいのですが、現在、全ての項目に当てはまるものと一緒に、1つでも含んだデータまでもが表示されてしまいます。
お忙しい中恐縮ですが、お知恵を頂戴出来ればと考えております。
宜しくお願い致します。
//POSTで受け取ったデータを配列にし、
foreach($arr as $category){
$wherearr1[] = " ( category = '$category' )" }
foreach($arr as $category){
$wherearr2[] = " ( age = '$age' )" }
$wherestr1 = implode(" OR ",$wherearr1);
$wherestr2 = implode(" OR ",$wherearr2);
$sql = "select * from member where $wherestr AND $wherestr1 order by date desc";
$result = mysql_query($sql);
補足
ご回答、ありがとうございます。 こちらの疑問点を、箇条書きします。 (1)CGI.pmとは、なんでしょうか?perlのソースもしくは、環境をみればいいのでしょうか? (2)ソースコードを書きます。かなり、長いので、受け取りの部分を中心に書きます。 # 初期設定 #======================================================================# require $require if -e $require; if($ENV{'REQUEST_METHOD'} eq "POST"){ read(STDIN,$QUERY,$ENV{'CONTENT_LENGTH'}) }else{ $QUERY = $ENV{'QUERY_STRING'} } $i = 0; @QUERY=split(/&/,$QUERY); foreach (@QUERY){ ($n,$v)=split(/=/); $v=~ tr/+/ /; next if $n eq "data" && $v !~ /[^\d\%]/ && (@data = split('%',$v)); $v=~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $n=~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $v=~ s/\r|\n|\t| / /g; $v=~ s/\s+(""|"|,)\s+/ /g; $v=~ s/^(""|"|,)$//g; next if $n eq "" || $v eq ""; &jcode'convert(*v,'sjis') if $jcode'version; if($n=~ /^IDn/){ $ID{$n}=$v }elsif($n=~ /^IDv(\d+)/){ $IDv{$1}.=" " if $IDv{$1}; $IDv{$1}.=$v }else{ $s=$n=~ /^join/ ?"":" "; $FORM{$n}.=$s if $FORM{$n}; $FORM{$n}.=$v } } if($FORM{'query'}){$i = 0; @QUERY = split(/&/,$FORM{'query'}); foreach (@QUERY){ ($n,$v)=split(/=/); next if $n eq "" || $v eq ""; if($n=~ /^IDn/){ $ID{$n}=$v }elsif($n=~ /^IDv(\d+)/){ $IDv{$1}.=" " if $IDv{$1}; $IDv{$1}.=$v }else{ $s=$n=~ /^join/ ?"":" "; $FORM{$n}.=$s if $FORM{$n}; $FORM{$n}.=$v } } } $print_max=$FORM{print} if $FORM{print} && $FORM{print} !~ /\D/; $print_max=$max_max if $print_max > $max_max; $n=~ /IDn(\d+)/ &&($FORM{$v}=$IDv{$1})while ($n,$v)=each(%ID); if($QUERY=~ /join/){ $n=~ s/^join// && push(@form,"$n\t$v"),delete $FORM{"join$n"} while ($n,$v)=each(%FORM); foreach(@form){ ($n,$v)=split(/\t/); $FORM{$n}=$v if $n ne "" && $v ne "" } undef @form; } if($QUERY=~ /select/){ while(($n,$v)=each(%FORM)){ if($n=~ s/^select// && $FORM{"$v$n"} eq ""){ push(@form,"$v$n\t$FORM{\"value$n\"}"); delete $FORM{"select$n"} } } foreach(@form){ ($n,$v)=split(/\t/); $FORM{$n}=$v if $n ne "" && $v ne "" } undef @form } です。 以上