CGI-BBS > データベース > 簡易データベース > 検索項目のカスタマイズ


カレッヂ
カレッヂ


質問者 KIDS  投稿日 7/12(木) 11:21:38
検索項目を追加したり、カスタマイズしたのですが、その項目での検索が有効になりません。例えば、セレクトメニューを追加したのですが、"all"では結果表示してくれるのですが、それぞれのメニューを選ぶとヒットしません。
以前にも同様Ques.があったみたいですがレスがついてないもので、改めて質問させて頂きます。
CGIについては文法等はよく解ってませんが、なんとなくこの辺がこんな命令してるんだろうなあが解るか解らない程度です。それとも、この手の具体的な方法を聞くのはタブーなのでしょうか?
よろしくお願いします。
回答者 呑兵衛  [削除]  投稿日 7/12(木) 21:01:43
呑兵衛といいます。

このような場合、<form></form>内で扱われる name="hoge"が
cgi での $DATA などで括られる中身を split で分解した時の $hoge とか、
$FORM{'hoge'}などと受取れていないことが多いようです。
要は cgi に変数の受け皿がないか足りない、ということです。

これらはregist.cgiやsearch.cgiなど、HTMLのフォームから送られてくる
変数の評価をする、全ての正確な場所で記述されねばなりません。
一ヶ所抜かしても正しい答えは得られません。
質問者 KIDS  [削除]  投稿日 7/13(金) 01:55:45
呑兵衛様、ご丁寧なご回答ありがとうございます。
ただ、重ねて質問して申し訳ないのですが、CSVファイルにも、登録結果画面にも追加された変数は引き渡されています。
そして、input type=textでの追加項目はちゃんと検索してくれるのですが、select optionがだめみたいです。

>変数の評価をする、全ての正確な場所で記述されねばなりません。
>一ヶ所抜かしても正しい答えは得られません。

search.cgiの方ではサンプルでもそうであるように変数全てで検索するわけじゃないですよね、任意の検索条件だけ指定すると思うんですが、その場合の上記の「正確な場所」「一ケ所抜かしても」とはどういうことになるのでしょうか?

お手数をおかけしますがご回答いただけると幸いです。よろしくお願いします。
回答者 呑兵衛  [削除]  投稿日 7/13(金) 13:25:42
デフォルトのスクリプトでお答えしますね。

regist.html から
名前 <input type=text name="NAME" size="10">
メールアドレス <input type=text name="EMAIL" size="20">
男女別 <select name="SEX" size="1">
年齢層 <select name="AGE" size="1">
ニックネーム <input type=text name="HANDLE" size="10">
都道府県 <select name="PREF" size="1">
ひとこと <input type=text name="REM" size="40">
という7項目が送られてきます。

次に 受取る regist.cgi は
$FORM{$name} = $value; と、$FORMの連想配列
('NAME','hoge','EMAIL','var@foo','SEX','男,'AGE','20','HANDLE','honyara','PREF','海外','REM','')
のようにまとめていきます。(ここはメモリ内の処理です)
それを一人分のデータの区切りの , と日時を加えて
"\,$date_now,$FORM{'NAME'},$FORM{'EMAIL'},$FORM{'SEX'},$FORM{'AGE'},$FORM{'HANDLE'},$FORM{'PREF'},$FORM{'REM'}"
と受取り、 $file に追加記入します。

index.html では検索項目として
都道府県 <select name="PREF" size="1">
男女別 <select name="SEX" size="1">
年齢層 <select name="AGE" size="1">
ニックネーム <input type=text name="HANDLE" size="10">
の検索項目をあげ、どの入力があっても良いように
search.cgi で 記録されている $file(csv形式) を 呼び出して、
$dataに代入したそれぞれの値を , を区切りにしたデータごとに
($d,$DATE,$NAME,$EMAIL,$SEX,$AGE,$HANDLE,$PREF,$REM) = split(/\,/,$data);
と分解し、それぞれ値が一致するかの評価を行っています。
最後に、検索結果の表示をする前にも、
($d,$DATE,$NAME,$EMAIL,$SEX,$AGE,$HANDLE,$PREF,$REM) = split(/\,/,$data);
と分解した上で、HTMLに結果を渡しています。

データが空であってもかまいませんが、データの値を記録したり取り出す時は
記録する regist.cgi や検索する search.cgi では取り出す変数の並びは
同一でなければなりません。また変数名も同じものがあってはなりません。
この順番を抜かしたり変えたりすると、
思った検索結果が得られないということになります。
質問者 KIDS  [削除]  投稿日 7/13(金) 23:18:37
どうもありがとうございます。
恐らく素人ズレした質問だと思いますが、解りやすくご説明頂き大変感謝しております。
しかし、残念ながらご指摘の部分は再確認したところ、やはり問題なく順番違い、抜け等は無いようです。
流れ的にはregist.htmlで入力した各変数は順番通りcsvファイルに代入され、index.htmlより引き渡された<option value>値(もちろん値にミスはありません)が絡むとHITしないという現象が起きています。それ以外ならちゃんとHITしてくれるのに・・・う〜ん、HTMLでのフォームの方の順番って関係ないですよね?(一応合わしてはみましたが)もうお手上げでしょうか?
回答者 呑兵衛  [削除]  投稿日 7/14(土) 01:37:04
デフォルトでは index.html というファイルはありませんが
これはどのようなファイルなのでしょうか?

またよろしければ、regist.cgi search.cgi regist.html search.html が拝見できると
何かわかるかもしれません。
直メールでも良いですので何か知る方法があれば検討ください。
回答者 呑兵衛  [削除]  投稿日 7/14(土) 01:39:43
間違いました。 index.html を 当方の都合で search.html に名前を変えていました。
よって、拝見したいファイルに search.html はありません。
質問者 KIDS  [削除]  投稿日 7/14(土) 12:56:15
迅速かつ快いお優しいご対応、大変感謝いたします。
お言葉に甘え直メールにてファイルを転送させて頂きますので、
よろしくご教授くださいましたら幸いに存じます。
回答者 呑兵衛  [削除]  投稿日 7/14(土) 16:29:17
拝読いたしました。
皆さんにもわかるようにここにお答えいたします。

解決策です。
search.cgiの中に2行ある(デフォルト)
($d,$DATE,$NAME,$EMAIL,$SEX,$AGE,$HANDLE,$PREF,$REM) = split(/\,/,$data);
の次に
chomp;
と入れてください。
改行コードを取り去る、という意味です。
検索項目であり、かつ、記録するデータを最後の変数に持ってくる場合、
あなたのものであれば
chomp $STYLE;
でもかまいません。

解説です。
デフォルトでは regist.cgi の最後に記録される項目が「ひとこと」で
<input type=text name="REM" size="40">になっており
data.csv には
"\,$date_now,$FORM{'NAME'},$FORM{'EMAIL'},$FORM{'SEX'},$FORM{'AGE'},$FORM{'HANDLE'},$FORM{'PREF'},$FORM{'REM'}\n";
の並びで記録されます。

それを serch.cgi でも
($d,$DATE,$NAME,$EMAIL,$SEX,$AGE,$HANDLE,$PREF,$REM) = split(/\,/,$data);
と取り出し検索しますが、「ひとこと」の検索項目はありません。

ところがカスタマイズし、記録するデータに検索項目を指定し、
なおかつその変数をデータ行の最後に持ってきたことがヒットしなかった原因です。
なぜなら最後の変数には、次の新しいデータの記録のために、
検索文字列にない「改行コード」がくっついているからです。

このページは終了したので返信(回答)は書きこめません

Web裏技