CGIでの検索について

[上に] [前に] [次に]
kawa [E-Mail] 1999/04/17(土) 12:38:10
if ($FORM{'???'} ne 'all') {
if ($??? eq $FORM{'???'}) { ; } else { next; }
}

にhtmlの検索ページから
<option value="????"> 
を代入して条件検索を作っているのですが、
この場合だと一つの条件のみしか検索できません。
例えばAとBを同時に検索対象にする場合には、
検索ページの
<option value="????"> 
の????の部分を複数にするにはどうしたらよいのでしょうか?


B-Cus 1999/04/17(土) 12:58:17
 http://www.jp.freebsd.org/search.html#doc
のように、checkboxを使って、
 <input type="checkbox" name="hoge" value="data1">
 <input type="checkbox" name="hoge" value="data2">
 <input type="checkbox" name="hoge" value="data3">
など書きます。例えばここで data1と data3をチェックしたなら
 hoge=data1&hoge=data3
というデータがCGIに送られるので、それを適当に解析すればいいです。

あと、もうちょっと第三者がすぐ理解できるような質問の仕方を
した方がいいと思います。特にこの部分。
 > if ($FORM{'???'} ne 'all') {
 > if ($??? eq $FORM{'???'}) { ; } else { next; }
 > }

kawa [E-Mail] 1999/04/17(土) 13:36:27
ご助言ありがとうございます。確かに、説明不足でした。すいませんでした。長くなりますが、もう一度説明させていただきます。
登録事項は年齢なのですが、HTMLからの
<select name="AGE" size="1">
<option VALUE="1"> 1歳
<option VALUE="2"> 2歳
    | 
<option VALUE="100"> 100歳 
</select>
で行っていて、
このデータをCGIに渡し、
open(FILE, "$file");
@data = <FILE>;
close(FILE);
unshift(@data,"\,$FORM{'AGE'}\n");
open(FILE, ">$file");
print FILE @data;
close(FILE);
としてデータファイルに書き込んでいます。

そして検索するのには
HTMLにて
<select name="AGE" size="1">
<option VALUE="10〜19"> 10歳代
<option VALUE="20〜29"> 20歳代
    | 
<option VALUE="60〜100"> 60歳以上 
</select>
としたいうふうに登録時とは異なり、一定のデータを一つにまとめて検索出来るようにしたいのです。
現在の検索CGIでは、
if ($FORM{'AGE'} ne 'all') {
if ($AGE eq $FORM{'AGE'}) { ; } else { next; }
}
となっているのですが、現状では年齢データ数字を一致させなければヒットしません。
どのように変更したらよろしいのでしょうか?
よろしくお願いします。

B-Cus 1999/04/17(土) 13:59:55
ああ、checkboxは関係なかったのですね。

> <option VALUE="1"> 1歳
> <option VALUE="10〜19"> 10歳代

まず、全角数字を使わないようにしましょう。なぜなら半角数字の方が
検索が楽だからです。以下は半角に直したものとして説明します。

ファイルに
 12
 35
 8
という3つの年齢が入っているとします。ここで10〜19を検索すると
「12」が出て来て欲しいわけです。検索用HTMLは
 <select name="AGE" size="1">
 <option VALUE="10-19"> 10歳代
と書きます。すると
 $FORM{'AGE'} eq "10-19"
になります。ここで、検索したい年齢の下限を AGE_START、
上限を AGE_END とします。例えば
 ($AGE_START,$AGE_END} = split(/-/,$FORM{'AGE'})
で、$AGE_START と $AGE_ENDには、それぞれ10と19が代入されます。

そしたら後は、ファイルを読んで、上限と下限の間の年齢をリストアップ
するだけです。
 open(FILE, "$file");
 while (<FILE>){
  chop;
  if ( $AGE_START <= $_ && $_ <= $AGE_END ){
   見つかった。
  }
 }
こういう風にすると、
 <input type="text" name="AGE_START">歳から
 <input type="text" name="AGE_END">歳まで検索
と書くことで、検索幅を自由に決めることもできます。


まぁ、いろんなやり方があるでしょうが、あくまでも一例ということで。

kawa 1999/04/17(土) 15:26:40
ご助言ありがとうございます。

まず、登録フォームの数字を半角にいたしまして、再登録してみました

そして、検索CGIを下記のように変更しましたが、
サーバーエラーになってしまいます。
CGIに関しては全くのド素人なので、どこがまずいのかわかりません。
パーミッションは変更してあるのですが。。
お願いします。

if ($FORM{'AGE'} ne 'all') {
if ($AGE_START,$AGE_END} = split(/-/,$FORM{'AGE'}) { ; } else { next; }
}

kawa 1999/04/17(土) 15:31:08
ちなみに元のスクリプトはWeb裏技の簡易データーベースです。

ふじ 1999/04/17(土) 15:39:06
2行目の $AGE_END} は $AGE_END) では?

kawa 1999/04/17(土) 16:01:41
ご意見ありがとうございます。
ご指摘のように、

if ($FORM{'AGE'} ne 'all') {
if ($AGE_START,$AGE_END) = split(/-/,$FORM{'AGE'})  { ; } else { next; }
}

としましたが、やはりサーバーエラーになってしまいます。



kawa 1999/04/17(土) 16:33:36

if ($FORM{'AGE'} ne 'all') {
if (($AGE_START,$AGE_END) = split(/-/,$FORM{'AGE'})) { ; } else { next; }
}
にするとエラーはなく一応表示されるのですが、
どの年齢で検索しても表示されてしまいます。
なぜ??

kawa 1999/04/17(土) 17:33:58
追加情報です。
関連すると思われる部分を下記にあげてみました。

$data = $data2 = $BASE[$num];
&jcode'convert(*data,'euc');
($d,$AGE,$PREF) = split(/\,/,$data);

# 都道府県(一致)
if ($FORM{'PREF'} ne 'all') {
if ($PREF eq $FORM{'PREF'}) { ; } else { next; }
}

# 年齢(一致)
if ($FORM{'AGE'} ne 'all') {
if (($AGE_START,$AGE_END) = split(/-/,$FORM{'AGE'})) { ; } else { next; }
}


よろしくお願いします。

kawa 1999/04/18(日) 06:36:25
どなたかお願いします。

B-Cus 1999/04/18(日) 07:32:43
> どなたかお願いします。

まぁそう急がずに ;-)

適当な場所($FORM{AGE}が設定された後 & ループの前)に
 ($AGE_START,$AGE_END} = split(/-/,$FORM{'AGE'});
を追加して、
 if ($FORM{'AGE'} ne 'all') {
 if (($AGE_START,$AGE_END) = split(/-/,$FORM{'AGE'})) { ; } else { next; }
 }
の部分を
 if ($FORM{'AGE'} ne 'all') {
 if ( $AGE_START <= $_ && $_ <= $AGE_END ){ ; } else { next; }
 }
に変えればいいでしょう。

各行の意味をよーく考え、どこに書くべきかを考えてください。
そんなに難しいことをしているわけではないので、これでわからなければ
まずはperlの勉強から始めましょう。

ところでsplitの意味はご存知ですか?
# 当然ですが、「知っている」あるいは「知らなかったので調べてみた」
# という回答を期待しています。

B-Cus 1999/04/18(日) 07:43:46
追加。

> ちなみに元のスクリプトはWeb裏技の簡易データーベースです。

このプログラムを僕は知らないし、どこで配布されているかも
知らないので、上の通りにしても動作しないかもしれません。

kawa 1999/04/18(日) 09:19:59
何度もすいません。
エラーは起きないのですが、
やはりどの年齢で検索しても表示されてしまいます。

>ところでsplitの意味はご存知ですか?
知りませんでした。
調べてみましたら、文字列を区切り文字で分割する、とありました。
ということは、
登録HTMLを、
<option VALUE="0-1"> 1歳
<option VALUE="0-2"> 2歳
    | 
<option VALUE="2-25> 25歳 
として、"-"の前の数字で検索するようにしてもよいのでしょうか。

kawa 1999/04/18(日) 12:46:44
[[解決]]
何とか解決しました。
B-Cusさん、 ふじさん、 ご助言ありがとうございました。


[上に] [前に] [次に]