CGI-BBS > 情報収集 > フォームメール > 入力チェックがエラーにばかりなってしまう


カレッヂ
カレッヂ


質問者 ジゴ郎  投稿日 6/20(水) 09:51:56
入力項目のチェックで、入力をしていてもエラー表示されてしまうのですが、プログラミングのどこがダメなのかわかりません、どなたかアドバイスをください!
6回チェックをしていて、フラグをテーブルに立てているのですが、e-mailチェック以外全部毎回エラーになってしまっていますが。。。

プログラムソース
http://www.seeg.co.jp/test/cgi-bin/mail.txt

テストhtml
http://www.seeg.co.jp/test/mail/mail.html
回答者 呑兵衛  [削除]  投稿日 6/20(水) 17:42:30
呑兵衛といいます。

formからcgiにデータが送られていません。だから空っぽのデータを評価するため
チェックルーチン以外働かないのです。emailの項がチェックされないのは
同じ空文字同士だからですね。
送らない原因は htmlの
> <FORM METHOD="POST" ACTION="../cgi-bin/mail.cgi" ENCTYPE="multipart/form-data">
の ENCTYPE="multipart/form-data" です。取り去りましょう。

以下、mail.cgi。

> # Open pipe for nkf
> open(NKFOUT, "|$nkf -s");
> close(NKFOUT);

formからの入力を一括してnkfで処理しようとしていますが、これは止めましょう。
なぜなら、htmlのコードがshift_jisで出力されているから必要がありませんし、
URLエンコード後に更にjcode.plででも'sjis'処理しています。
もちろん、処理過程も正しいとは思えないので、上記2行は消しましょう。

> if (($FORM{'k-name'} eq "") ||
>    ($FORM{'f-name'} eq "")){
チェックルーチン内全ての if 以下で ( ) が多すぎます。
if ($FORM{'k-name'} eq "" || $FORM{'f-name'} eq "") {
です。

> open (MAIL, "|$nkf -s |$mailprog $recipient")
これはいただけません。
メール文は -s ではなく、-j とjis処理です。
それから、$recipient はやめて
To: $recipient とし Reply to: の前にでも入れてみて下さい。

> require 'jcode.pl-2.0';
このファイル名で正しいのですね。

> print MAIL<<"EOF" ;
ファイルハンドルとヒアドキュメントの開始はきちんと分けましょう。
print MAIL <<"EOF";
です。

> print NKFOUT <<"EOF" ;
このような書き方は正しくありません。
print <<"EOF";
です。

他にもいっぱいありますがこのくらいで。とりあえずは動くと思いますので。
質問者 ジゴ郎  [削除]  投稿日 6/21(木) 09:35:41
呑兵衛さん、はじめまして。早速ありがとうございます。
大変親切なご回答に感動して目頭が熱くなっています。

一つ一つチェックして、テストしてみました。
今度はサーバー内エラーというような表示がでてきました。
telnetで./mail.cgiと実行してみると、
エラーの場合のメッセージが出力されるだけですが、
まだ問題山積みなのでしょうか?

html
http://www.seeg.co.jp/test/mail/mail.html

cgi
http://www.seeg.co.jp/test/cgi-bin/mail.txt
回答者 呑兵衛  [削除]  投稿日 6/21(木) 19:57:36
そうですね、Internal Server Errorが出ると後で気づきました。

変数の定義で ; までの間にスペースのあってはならない個所が散見されます。
ほかにもいっぱい無駄とエラー個所があり、
私の環境では nfk が試されませんので jcode.pl 用に書き直したものを
見本で進呈します。貴殿の書かれたものとよく見比べてください。

mail.cgi(mail.txt)変更済 これでだめなら nkfの処理が間違っているのでしょう。
http://www11.freeweb.ne.jp/travel/mac-mac/mail.txt

見本
http://www11.freeweb.ne.jp/travel/mac-mac/mihon.txt

telnetが使えるのなら、スクリプトのあるディレクトリで
perl -c hoge.cgi エラーを見つける
perl -cw hoge.cgi エラーと注意事項を吐き出す
perl -d hoge.cgi sを叩きエンターでデバッグモード 終了はq
も便利なデバッグ機能です。

では。
回答者 呑兵衛  [削除]  投稿日 6/21(木) 22:54:13
見本のほうで2、3ヶ所書き換えました。

動かないわけではないのですが、見苦しい展開があったもので。
sub error にはありもしない &html_head; などとしてたり
print MAIL "From: $FORM{'email'}\n\n"; などと途中で
メールヘッダーを終わらせていたりしたところの書き換えをしています。

あ〜恥ずかしい。
では。
質問者 ジゴ郎  [削除]  投稿日 6/22(金) 09:39:37
呑兵衛さん、たびたびありがとうございます。
見本と変更cgiをコピーして頂戴いたしました。
変更cgiはとてもすっきりしています、
;の前のスペースなど、ちゃんと見比べます。
すみません初心者というかド素人で、恥ずかしいです。

変更cgiのほうで最初行のperlパスのみ変更してUPしましたが、
やはりサーバエラーのメッセージが出ています。
telnetでは正常終了していました。

nkfの処理がいけないのでしょうか?
どのような対処が必要でしょうか?
回答者 呑兵衛  [削除]  投稿日 6/22(金) 12:36:05
nkfを最初の変数で
$nkf = '/usr/local/sbin/nkf -s';
としていながら、送信ルーチンで

open (MAIL, "|$nkf -j |$mailprog");
になったままでしたね。
$nkf = '/usr/local/sbin/nkf';
にしています。

新しく書き換えてますので、前掲の mail.txt でお試しください。
また、 nkfを使わない jcode.pl バージョンが見本です。
いくつかの変更も加えています。ファイル名変更だけでそのままいけるかも。
質問者 ジゴ郎  [削除]  投稿日 6/22(金) 13:30:05
呑兵衛さん、出来ました!呑兵衛さんに添削どころか、
作り直しくらいのレベルで修正いただいたおかげです。
本当にありがとうございます。

これまでずっとこのcgiを元に流用して使っていたのが、
今となっては恐ろしいです。
CGI全般、まだ全然理解できていませんので、
今回の質疑応答と頂戴した見本も研究して頑張って強くなります!

呑兵衛さんが掲載してくださったtxtの最終版もコピーして
頂戴いたしましたので削除されてもかまいません。

ご親切ご丁寧なアドバイス本当にありがとうございました。

返信(回答)する


Web裏技