CGI-BBS > CGI > Perl > 検索がうまくいきません


カレッヂ
カレッヂ


質問者 Octo  投稿日 3/13(火) 19:47:50
IDとパスワードで検索をかけようとしていますが、うまくいきません。
正しいパスワードを入れているはずなのですが、なぜか
「パスワードが違っています」とのエラーがでます。
不思議なことに最後に入れたレコードを検索すると別の反応が
あります(といってもInternal Server Error なのですけど)。

パスワードチェックの部分は下記の通りです。
$datafileの中のレコードはタブ区切りで、
レコードの1番目の要素($rec[0])がID、19番目の要素($rec[18])が
パスワードです。
また、検索フォームのID入力欄が「axsid」で、
パスワード入力欄が「checkpw」です。

よろしくお願いします。

open (REC,"<$datafile");
while(<REC>){@rec=split(/\t/,$_);

if($rec[0] eq $FORM{'axsid'} && $rec[18] ne $FORM{'checkpw'}){
print<<"DIFPW";
Content-Type: Text/Html

<html><head><title>検索結果</title></head>
<body bgcolor="lightgreen"><center><font color="darkblue"><hr>
<b>パスワードが違っています。</b><p>
検索画面に戻る場合はブラウザの「戻る」ボタンをクリックしてください。<hr>
</font></center></body></html>
DIFPW
last;}
回答者 しあわせのツボ  [削除]  投稿日 3/13(火) 21:40:39
データファイルには1レコードに何項目ありますか?
パスワードが最後の項目だとすると、レコード区切りの改行もそのまま変数に格納されています。
予め chomp($rec[18]); として改行を取り除いて下さい。
質問者 Octo  [削除]  投稿日 3/14(水) 09:09:53
しあわせのつぼ様
大当たりです!項目数は全部で19。つまり$rec[18]は最後の項目です。
最後のレコードだけは末尾に改行コードが入らないようになってるので・・・
さっそくためしてみます。

最後のレコードで検索をかけたらサーバエラーになるのは
この下にあるelsif文(今回は掲載してませんけど)の
どこかに問題があるのでしょうね。
質問者 Octo  [削除]  投稿日 3/14(水) 12:16:02
そういえば、chompって「最後の1バイトを削除」ではなかったで
しょうか?
だとしたら、
最後のレコード(改行コードなし)でこれをやるとデータそのものを
削ってしまうことになるので、$rec[18]=~s/\n$//; あたりに
しておいた方がいいということでしょうか。

ちなみに、このデータファイルの書き込みの仕方は
・初期値として見出し行が入っている(末尾の改行コードなし)
・書き込み時はまず既存のデータの末尾に改行コードを入れ
 その後に新データ(末尾の改行コードなし)を追記する
というものです。
回答者 しあわせのツボ  [削除]  投稿日 3/14(水) 12:29:56
「最後の1バイトを削除」はchopです。
chompは「最後の1バイトが改行コード(変更可能)なら削除」という処理をしてくれます。
質問者 Octo  [削除]  投稿日 3/14(水) 12:37:15
しあわせのツボ様
毎度ごていねいにどうもありがとうございます。
さっそくやってみようと思います。
質問者 Octo  [削除]  投稿日 3/14(水) 14:52:05
さっそくやってみましたが・・・
こんどはすべてのレコードについて
「パスワードが違う」と出てきてしまいます。

open (REC,"<$datafile");
while(<REC>){@rec=split(/\t/,$_);

$rec[18] = chomp($rec[18]);

if($rec[0] eq $FORM{'axsid'} && $rec[18] ne $FORM{'checkpw'}){
print<<"DIFPW";
Content-Type: Text/Html

<html><head><title>検索結果</title></head>
<body bgcolor="lightgreen"><center><font color="darkblue"><hr>
<b>パスワードが違っています。</b><p>
検索画面に戻る場合はブラウザの「戻る」ボタンをクリックしてください。<hr>
</font></center></body></html>
DIFPW
last;}

どこがおかしいのでしょうか??
パスワードは間違いなく19番めの項目(ゼロから数えれば18)
なのですが・・・
質問者 Octo  [削除]  投稿日 3/14(水) 19:48:04
結局chompのかわりに $rec[18]=~s/\n$//; としたら
うまく作動しました。
chompの使い方、どこか間違ってたんでしょうか・・・?

とりあえず、動作がうまくいったということで
この件は終了とします。
ご協力ありがとうございました!

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

Web裏技