• 締切済み

チェックボックスでのor検索

中古車検索用のcgiを改造しています。 複数選択式のチェックボックスでor検索をやりたいのですが、うまくいきません。 通常の複数選択式チェックボックスは、and検索なので、例えば2つにチェックするとその2つ両方を満たすものが出てくるのですが、中古車屋の所在地を都道府県でチェックするような場合は、東京or埼玉というようにand検索ではなくor検索が都合いいのです。 (東京or埼玉)and(オープンカーorセダン)and(○○or○○) といった具合に、各name毎にグループ分けしたグループ内をor検索、グループ同士はand検索にいたいと思っています。 どなたか教えていただけませんか? 又は、複数選択式checkboxのor検索のやり方だけでも助かります。

みんなの回答

  • hok212
  • ベストアンサー率66% (100/150)
回答No.3

例えば次のようなHTMLフォームがあるとします。 <INPUT TYPE="CHECKBOX" NAME="area1" VALUE="1">東京 <INPUT TYPE="CHECKBOX" NAME="area2" VALUE="2">埼玉 <INPUT TYPE="CHECKBOX" NAME="area3" VALUE="3">静岡 このフォームから渡された値をcgi-lib.plでデコードすると $in{'area1'}、$in{'area2'}、$in{'area3'} と3つの変数に値が入ります。 (もちろん対象のフォームがチェックされない場合は、なにも値が渡りません) それで、データファイルの地域が入っているフィールド名を$areaとし、東京のarea番号が1、埼玉のarea番号が2、静岡のarea番号が3という形式でデータが保管されているとします。 これで条件式を作ると次のようになります。 if ($area eq $in{'area1'} || $area eq $in{'area2'} || $area eq $in{'area3'}) { 条件にマッチした際の処理 } ※ 読みやすいように 比較演算子に「eq」を使いましたが、「==」でも問題なく動きます。

  • hok212
  • ベストアンサー率66% (100/150)
回答No.2

HTMLの部分ですが。。。 > print "<INPUT TYPE=CHECKBOX NAME=area VALUE=\"99\">指定無し\n\n"; > print "<INPUT TYPE=CHECKBOX NAME=area VALUE=\"1\">東京\n\n"; > print "<INPUT TYPE=CHECKBOX NAME=area VALUE=\"2\">埼玉\n\n"; > print "<INPUT TYPE=CHECKBOX NAME=area VALUE=\"3\">静岡\n\n"; このような指定方法はcheckboxでは使えない方法です。 これはradio-buttonのときに使う方法です。 checkboxの場合は項目数に合わせて area1 area2 area3 などと異なるname値を指定しなければいけません。 なぜかというと。。。 上記のように4つのcheckboxがあるとして、全てを選択したとすると、submit後にどのチェックボックからvalue値が渡されているのか判断できなくなるためです。 ご提示されたソースを見るとcgi-lib.plでエンコードを行っているようですが、 すべてのname="area"に対応するvalue値は $in{'area'} になってしまいますね。 これでは困ります。 そのためcheckboxを使う場合はname値が重複しないようにするのです。   checkboxを使う場合はname値を変える。   radio-buttonを使うときはname値を同じにする。 というように覚えましょう。 今回は or 判定のみを行いたいようですので、各項目ごとにcheckboxからradio-buttonに変更すればいいと思います。 and 判定も必要とのことでしたら、checkboxのままname値を変えればOKです。

k-araki
質問者

お礼

name値は別にするんですか!?なるほど。 or検索をするグループをラジオボタンに変えて、and検索にしたいところをname値を変えたところウマクいきました! ありがとう御座いました。大変参考になりました。

k-araki
質問者

補足

何度もすみません! もう一つお尋ねしたいのですが、 ラジオボタンだと、地域が一つしか選べないので、 (東京or静岡or埼玉) のように、複数選べてor検索するためにはどうしたらいいのでしょうか? 例えばYahooの中古車検索のように複数のエリアの中から検索みたいにしたいんですが。 http://usedcar.autos.yahoo.co.jp/joken.html

回答No.1

うーん(´・ω・`) これは処理的な事でしょうか?それとも 画面的な事でしょうか? 内容的には画面的な気がするので、画面の事だと 勝手に判断しておきます。 普通にグループ間はandでグループ内はorという 取り決めをする(説明書きをする)だけでいいのでは ないでしょうか? 都道府県: □東京 □埼玉 □静岡 車種  : □セダン □ワゴン □軽トラ 価格  : □~100万 □~300万 □~500万 ※各項目を選択してください。項目間はAND検索となります。 ※複数選択した場合は、項目毎にOR検索となります。 という感じじゃないでしょうか。 まさか、(東京andセダン) or (埼玉andワゴン)という ような変な検索を希望する人もいないでしょう(^^; 処理的な場合は、if条件又はDBなら検索条件を そのままand,orすればいいだけですよね?

k-araki
質問者

補足

ご回答ありがとうございます。 そして質問の仕方が悪くてすみません。 html部分はおっしゃるとおりのやり方で print "<INPUT TYPE=CHECKBOX NAME=area VALUE=\"99\">指定無し\n\n"; print "<INPUT TYPE=CHECKBOX NAME=area VALUE=\"1\">東京\n\n"; print "<INPUT TYPE=CHECKBOX NAME=area VALUE=\"2\">埼玉\n\n"; print "<INPUT TYPE=CHECKBOX NAME=area VALUE=\"3\">静岡\n\n"; のように、グループ毎にnameをつけて1~3までのvalueをlogに保存しています。 実は、処理的な問題で悩んでいまして…。 言語はperlでcgiを書いています。 とりあえずログを呼び出して、 (1)グループの中で[指定無し]を押した場合 (2)条件があっている場合 以上2つにおいて、検索に引っかかるように指定しています。 open(IN,"$logfile") || &error("Open Error : $logfile"); $i=0; while (<IN>) { ($no,$sub,$com,$area,$syurui,$nedan,$it1,$it2,$it3,$it4,$it5,$it6,$it7,$it8,$it9,$it10,$it11,$it12,$cnt) = split(/<>/); if ($in{'area'} != 99 && $in{'area'} != $area) { next; } if ($in{'syurui'} != 99 && $in{'syurui'} != $syurui) { next; } if ($in{'nedan'} != 99 && $in{'nedan'} != $nedan) { next; } 以下続く… これで、全てがand検索になるんですが、or検索にする方法がわからずに悩んでいます。

関連するQ&A

専門家に質問してみよう