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さん、 ふじさん、 ご助言ありがとうございました。
[上に]
[前に]
[次に]