WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:入力チェックについて

なな [WriteDate : Wed Apr 18 11:34:06 2001]

「とほほのwww入門」さんのwwwmailというフォームのためのcgiを使わせてもらっているのですが、改造は自由らしいので喜んで使って
いるのですが、これに、入力チェックを追加したいのです。
どなたか、改造したことのある方、教えていただければ幸いです。
CGI初心者なもので、よくわからなくてすみません。


R.M [WriteDate : Wed Apr 18 13:04:23 2001]

入力チェックとは具体的にどのような処理なのでしょう?
どの入力内容をどのようにチェックしてその結果をどのように
フィードバックさせたいのか、詳しく書くと回答が得れやすい
とおもいます。


Nobu3 [MAIL] [URL] [WriteDate : Wed Apr 18 13:10:08 2001]

#   名    称: wwwmail Ver3.05
#   最終更新: 2000年11月2日

をそのまま使ってるものとして書いてみます。

140行目あたりに
#
# EMAILが指定されていなければ、(unknown)とする。
#
if ($FORM{'EMAIL'} eq "") {
    $FORM{'EMAIL'} = "(unknown)";
}

とあると思います。
この部分が未入力のチェック部分です。

送信側のHTMLで定義されているのは、NAME,EMAIL,HPAGE,MESSAGEの4つですから、EMAILを除いた3つについても

if ($FORM{'NAME'} eq "") {
  名前を書いてない時の処理
}
のようにやればいいです。


なな [WriteDate : Wed Apr 18 13:12:45 2001]

入力チェックは、フォームにお名前やメールなどを書いて
頂く簡単なものです。
その名前などをチェックして、空白だと送信できないように
するというものです。




なな [WriteDate : Wed Apr 18 13:16:45 2001]

>if ($FORM{'NAME'} eq "") {
  名前を書いてない時の処理
}
レスありがとうございます。これは、subとしてどこかに
書かなければならないのですか?(名前を書いていない時の処理を)


Nobu3 [MAIL] [URL] [WriteDate : Wed Apr 18 13:26:58 2001]

どちらでもかまいません。

極端な話をすれば、
if ($FORM{'NAME'} eq "") {
  $FORM{'NAME'} = '名無しさん';
}
でも、構わないです。
…が、エラーの処理は良く使うと思うので、簡単に出力できるようなsubを作っておくといいでしょう。


なな [WriteDate : Wed Apr 18 13:33:37 2001]

if ($FORM{'NAME'} eq "") {
  $FORM{'NAME'} = '名無しさん';
}
この処理だと、メールが送られてきた時に、名前のところに
名無しさんとでるのですか?

 わたしがやりたいのは、空白だと送れないようにしたいのです。
前にmailtoを使った時はjavaスクリプトで小さなエラーウインドウを
だすようにしたのですが、CGIでも可能ですか?


Nobu3 [MAIL] [URL] [WriteDate : Wed Apr 18 13:43:50 2001]

あら、混乱させてしまいましたか。
それとも、すぐに使えるサンプルがほしいのですか?

とにかく、素の命令でも、サブルーチン呼出しでも、どっちでも構わないと言う事です。

CGI(Perl)では、alert()のようなことはできません。


なな [WriteDate : Wed Apr 18 13:52:15 2001]

if ($FORM{'NAME'} eq "") {
  $FORM{'NAME'} = '名無しさん';
}
この処理では何がおこるのですか???

サンプルというか、うーむ。ただ、名前などが入力されてなかったら
”名前を入力してください”などの画面を出して、もう一度入力しなおしてもらうという処理がしたかったのです・・・。


Nobu3 [MAIL] [URL] [WriteDate : Wed Apr 18 13:54:27 2001]

名前が未記入の場合、エラーを出して終了。
if ($FORM{'NAME'} eq "") {
    $msg  = "<HTML>\n";
    $msg .= "<HEAD>\n";
    $msg .= "<TITLE>メール送信結果</TITLE>\n";
    $msg .= "</HEAD>\n";
    $msg .= "<BODY BGCOLOR=\"#FFFFFF\" TEXT=\"#000000\">\n";
    $msg .= '名前が記入されていません。';
    $msg .= "ブラウザの [戻る] ボタンで戻ってください。\n";
    $msg .= "</BODY>\n";
    $msg .= "</HTML>\n";

    &jcode'convert(*msg, "sjis");

    print "Content-type: text/html; charset=Shift_JIS\n";
    print "\n";
    print "$msg\n";

    exit(0);
}

となりますが、これと同じことを2、3回やらなくてはいけませんよね?
だから、「名前が記入されていません。」の部分だけを送れるようにする方がいいわけです。

if ($FORM{'NAME'} eq "") {
    &err('名前が記入されていません。');
}

sub err{
    my ($errmsg) = @_;
    $msg  = "<HTML>\n";
    $msg .= "<HEAD>\n";
    $msg .= "<TITLE>メール送信結果</TITLE>\n";
    $msg .= "</HEAD>\n";
    $msg .= "<BODY BGCOLOR=\"#FFFFFF\" TEXT=\"#000000\">\n";
    $msg .= $errmsg;
    $msg .= "ブラウザの [戻る] ボタンで戻ってください。\n";
    $msg .= "</BODY>\n";
    $msg .= "</HTML>\n";

    &jcode'convert(*msg, "sjis");

    print "Content-type: text/html; charset=Shift_JIS\n";
    print "\n";
    print "$msg\n";

    exit(0);
}

いかがでしょう?


Nobu3 [WriteDate : Wed Apr 18 13:56:40 2001]

あら、書いてる間に…。

>if ($FORM{'NAME'} eq "") {
>  $FORM{'NAME'} = '名無しさん';
>}
>この処理だと、メールが送られてきた時に、名前のところに
>名無しさんとでるのですか?

そうです。この処理では、名前が「名無しさん」で送信されます。


なな [WriteDate : Wed Apr 18 13:58:44 2001]

うわー!感激です!NOBU3さんありがとうございます。
じゃあちょっとテストしてみます。



なな [WriteDate : Wed Apr 18 14:16:35 2001]

うわーん!失敗しましたー!
なぜ?!まず、空で送信ボタン押してみたらこんなんでましたー(泣)
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator, www-admin and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.

それから、次にチェックするとこに文字を入れてみたら
検索中のページは問題がありますから表示できません。
て、でましたー!



Nobu3 [MAIL] [URL] [WriteDate : Wed Apr 18 14:25:24 2001]

・・・うーむ。そう言うレベルなのですか。
結構困りました。

「Internal Server Error」
というのは、サーバーが出すエラーで、Perlの出すエラーではありません。
つまり、何が原因なのかはサーバーのログを見ないといけません。

で、その前に。
改造する前は、ちゃんと動いてましたか?
もし動いていたなら、

BEGIN{
    print "Content-type: text/plain\n\n";
    open(STDERR, ">&STDOUT");
    $|=1;
}

というのを2行目以降に追加して実行してみてください。
動いてなければ……ここの入門を読んでみましょう。


なな [WriteDate : Wed Apr 18 14:29:36 2001]

入力チェックの前はちゃんとメール届きました。
じゃあ、BEGINっていうの書いてみます。


なな [WriteDate : Wed Apr 18 15:34:22 2001]

とほほさんの所の掲示板には(ちなみにURLはこれ)
http://www.wakusei.ne.jp/twn/wwwlng.cgi?print+200003/00030036.txt
デコードしなければならないと書かれていたのですが
これが原因なんでしょうかね???


Nobu3 [MAIL] [URL] [WriteDate : Wed Apr 18 16:08:08 2001]

???
ソースを見れば、デコード処理と漢字コード変換は、その時には終了しているはずです。
確かに、
$FORM{'NAME'} = '名無しさん';
は漢字コードの変換をしてなかったのでまずかったです。
でも、今は中身が空文字列なのかを見てるだけなので関係ないと思います…が、テストをしていない身ではなんともいえません。

Perlはどんな文句を言ってましたか?
サーバーのログを見たか、BEGINのやつを書いて実行すれば、それなりのメッセージが出てくるはずですが…。


なな [WriteDate : Wed Apr 18 16:12:37 2001]

BEGINはプログラム自体の2行目に書けばいいんですか?
さっきしたときは同じ英語のしかでてくれませんでした。
サーバーのログを見るしかないのでしょうか?
ちなみにログは簡単にみれるのですか?


Nobu3 [MAIL] [URL] [WriteDate : Wed Apr 18 16:37:26 2001]

そうです、プログラムの2行目に
# ここから
BEGIN{
    print "Content-type: text/plain\n\n";
    open(STDERR, ">&STDOUT");
    $|=1;
}
# ここまで
をコピーして貼りつけしてください。
で、実行した時に表示された文字を全部書いてください。
ちなみに、これでやっても日本語のメッセージは出ません。

サーバーのログはサーバーの管理者に言えば見せてもらえるかもしれません。


Nobu3 [WriteDate : Wed Apr 18 16:43:19 2001]

というか、改造した部分を見せてはもらえませんか?

それ以前に、プログラムの経験とかありますか?
もし、まったくないのであれば、改造はあきらめたほうがいいと思います。勉強する気があれば別ですが。


なな [WriteDate : Wed Apr 18 16:46:06 2001]

#!/usr/local/bin/perl

# ここから
BEGIN{
   print "Content-type: text/plain\n\n";
   open(STDERR, ">&STDOUT");
   $|=1;
}
# ここまで

こんな感じでアップしてみましたけど、
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator, www-admin and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.

というふうにでました。


なな [WriteDate : Wed Apr 18 16:51:54 2001]

改造って、NOBU3の書いてくれたのをくっつけただけなんですけど
いいですか?
ながいですけど、これが今の状態です。
#!/usr/local/bin/perl

# ここから
BEGIN{
   print "Content-type: text/plain\n\n";
   open(STDERR, ">&STDOUT");
   $|=1;
}
# ここまで

#=====================================================================
# カスタマイズ
#============'/usr/lib/sendmail'=========================================================
# ★ perlのパス名
#    このファイルの先頭の1行を、あなたが利用するサーバーにインストー
#    ルされた perl コマンドのパス名に応じて変更してください。例えば、
#    私が加入している BIGLOBE では、#!/usr/mesh/bin/perl となります。
#    解らない場合は、プロバイダやサーバの管理者にお問い合わせください。
#   「#!」の前には、空文字や空行がはいらないようにしてください。

# ★ 送信先メールアドレス
$mailto = 'iyoki@grade-one.co.jp';

# ★ サブジェクト(件名)
$subject = 'お問い合わせ';

# ★ メール送信コマンド
#    このコマンドが存在しない場合は、このスクリプトは動作しません。また、
#    存在していても、メール送信の設定が行われていない場合があります。詳
#    細はプロバイダやサーバーの管理者にお問い合わせください。
$sendmail = '/usr/lib/sendmail';

# ★ 漢字コード変換ライブラリ
#    wwwmail.cgi と同じディレクトリに置いてください。
$jcode = '/usr/local/lib/perl/jcode.pl';

# ★ MIMEコード変換ライブラリ
#    wwwmail.cgi と同じディレクトリに置いてください。
$mimew = 'mimew.pl';

# ★ 送信結果メッセージ(ヘッダ)
#    <<END_OF_DATA 〜 END_OF_DATA の間を好みにあわせて変更してください。
$header = <<END_OF_DATA;
<HTML>
<HEAD>
<TITLE>メール送信結果</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>メール送信結果</H1>
<HR>
下記のメールを送信しました。
ありがとうございました。
<HR>
END_OF_DATA

# ★ 送信結果メッセージ(フッタ)
#    <<END_OF_DATA 〜 END_OF_DATA の間を好みにあわせて変更してください。
$footer = <<END_OF_DATA;
<HR>
<A HREF="../index.htm">[戻る]</A>
</BODY>
</HTML>
END_OF_DATA

#====================================================================
# 自己診断機能。
#====================================================================
# メール送信がうまく動作しない時に、
# http://〜/〜/wwwmail.cgi?test の形式で呼び出してください。
if ($ARGV[0] eq "test") {
    print "Content-type: text/html\n";
    print "\n";
    print "<HTML>\n";
    print "<HEAD>\n";
    print "<TITLE>WwwMail自己診断</TITLE>\n";
    print "</HEAD>\n";
    print "<BODY>\n";
    print "CGIは正常に動作しています。<BR>\n";
    unless (-x $sendmail) {
        print "<P>$sendmail を実行できません。<BR>\n";
    }
    unless (-f $jcode) {
        print "<P>$jcode がありません。<BR>\n";
    }
    unless (-f $mimew) {
        print "<P>$mimew がありません。<BR>\n";
    }
    print "</BODY>\n";
    print "</HTML>\n";
    exit 0;
}

#====================================================================
# 本体
#====================================================================

#
# ライブラリの呼び出し
#
require $jcode;
require $mimew;

#
# 入力値を読み取る
#
if ($ENV{'REQUEST_METHOD'} eq "POST") {
    read(STDIN, $query_string, $ENV{'CONTENT_LENGTH'});
} else {
    $query_string = $ENV{'QUERY_STRING'};
}
@a = split(/&/, $query_string);
foreach $x (@a) {
    ($name, $value) = split(/=/, $x);
    $name =~ tr/+/ /;
    $name =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;
    &jcode'convert(*name, "jis");
    $value =~ tr/+/ /;
    $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;
    $value =~ s/[\r\n]+/\n/g;
    &jcode'convert(*value, "jis");
    if ($FORM{$name} eq "") {
        $FORM{$name} = $value;
        $FORM[$cnt++] = $name;
    } else {
        $FORM{$name} .= (" " . $value);
    }
}

#
# EMAILが指定されていなければ、(unknown)とする。
#
if ($FORM{'EMAIL'} eq "") {
    $FORM{'EMAIL'} = "(unknown)";
}
#名前がないときの処理
if ($FORM{'NAME'} eq "") {
   &err('名前が記入されていません。');
}
#電話番号がないときの処理
if ($FORM{'TEL'} eq "") {
   &err('電話番号が記入されていません。');
}
#
# メールヘッダを作成する
#
{
    &jcode'convert(*subject, "jis");
    $mailhead  = "To: $mailto\n";
    $mailhead .= "From: $FORM{'EMAIL'}\n";
    $mailhead .= "Subject: $subject\n";
    $mailhead .= "\n";
}

#
# メールボディを作成する
#
{
    for ($i = 0; $i < $cnt; $i++) {
        $mailbody .= "$FORM[$i] = $FORM{$FORM[$i]}\n";
    }

    # "." のみの行は ". " に変換する。
    # 2回繰り返さないと、2行連続で "." のみの行に対応できない
    # "." を ".." に変換する処理が一般的だそうだが、あえて、
    # "." を ". " に変換する。
    $mailbody =~ s/(^|\n)\.(\n|$)/$1. $2/g;
    $mailbody =~ s/(^|\n)\.(\n|$)/$1. $2/g;
}

#
# メールを送信する
#
if (-x $sendmail) {
    unless (open(OUT, "| $sendmail $mailto > /dev/null")) {
        &errexit("メールの送信に失敗しました。");
    }
    unless (print OUT &mimeencode($mailhead)) {
        &errexit("メールの送信に失敗しました。");
    }
    unless (print OUT $mailbody) {
        &errexit("メールの送信に失敗しました。");
    }
    close(OUT);
} else {
    &errexit("$sendmailがありません。");
}

#
# ブラウザ画面に送信結果を書き出す
#
{
    &jcode'convert(*header, "sjis");
    &jcode'convert(*footer, "sjis");

    $mail = $mailhead . $mailbody;
    &jcode'convert(*mail, "euc");
    $mail =~ s/&/&amp;/g;
    $mail =~ s/"/&quot;/g;
    $mail =~ s/</&lt;/g;
    $mail =~ s/>/&gt;/g;
    $mail =~ s/\n/<BR>/g;
    &jcode'convert(*mail, "sjis");

    print "Content-type: text/html; charset=Shift_JIS\n";
    print "\n";
    print "$header\n";
    print "$mail\n";
    print "$footer\n";
}

#
# エラーメッセージを出力して終了
#
sub errexit {
    $msg  = "<HTML>\n";
    $msg .= "<HEAD>\n";
    $msg .= "<TITLE>メール送信結果</TITLE>\n";
    $msg .= "</HEAD>\n";
    $msg .= "<BODY BGCOLOR=\"#FFFFFF\" TEXT=\"#000000\">\n";
    $msg .= "メールの送信に失敗しました。\n";
    $msg .= "ブラウザの [戻る] ボタンで戻ってください。\n";
    $msg .= "</BODY>\n";
    $msg .= "</HTML>\n";

    &jcode'convert(*msg, "sjis");

    print "Content-type: text/html; charset=Shift_JIS\n";
    print "\n";
    print "$msg\n";

    exit(0);
}

#
#入力チェックエラーメッセージ
#

sub err{
  my ($errmsg) = @_;
   $msg  = "<HTML>\n";
   $msg .= "<HEAD>\n";
   $msg .= "<TITLE>メール送信結果</TITLE>\n";
   $msg .= "</HEAD>\n";
   $msg .= "<BODY BGCOLOR=\"#FFFFFF\" TEXT=\"#000000\">\n";
   $msg .= $errmsg;
   $msg .= "ブラウザの [戻る] ボタンで戻ってください。\n";
   $msg .= "</BODY>\n";
   $msg .= "</HTML>\n";

   &jcode'convert(*msg, "sjis");

   print "Content-type: text/html; charset=Shift_JIS\n";
   print "\n";
   print "$msg\n";

   exit(0);
}

という状態です。さっき、教えて頂いたプログラムを全部コメントにしてアップしてみたら、きちんとメールが送られてきました。
ちなみにプログラムの(Perl)の初心者です。ひよこです。(泣)
ほんとに手の焼けるやつでごめんなさい。


Nobu3 [MAIL] [URL] [WriteDate : Wed Apr 18 17:08:05 2001]

うーむ…。なんでだ???

とりあえず、BEGINのやつはもう要りません。
で、sub errを少し変更してみましょう。

sub err{
  $msg  = "<HTML>\n";
  $msg .= "<HEAD>\n";
  $msg .= "<TITLE>メール送信結果</TITLE>\n";
  $msg .= "</HEAD>\n";
  $msg .= "<BODY BGCOLOR=\"#FFFFFF\" TEXT=\"#000000\">\n";
  $msg .= $_[0];
  $msg .= "ブラウザの [戻る] ボタンで戻ってください。\n";
  $msg .= "</BODY>\n";
  $msg .= "</HTML>\n";

  &jcode'convert(*msg, "sjis");

  print "Content-type: text/html; charset=Shift_JIS\n";
  print "\n";
  print "$msg\n";

  exit(0);
}

にしてみてください。
これでダメなら、お手上げです。


なな [WriteDate : Wed Apr 18 17:16:36 2001]

はぁ〜〜!やってみたんですけど、だめですぅ〜。(泣)

お手上げですか〜?!
うわーん!
しかしとほほさんのとこのラウンジはいつ再開するんでしょうね。

いやーでも,Nobu3さん今日一日ありがとうございました。
とても親切にしてくれて本当にありがたかったです。
とりあえず、まだ回答のままにしておきますね。
本当にありがとう!!


Nobu3 [MAIL] [URL] [WriteDate : Wed Apr 18 17:29:14 2001]

Perlのバージョンのせいだと思ったのですが…。違いましたか。
せめてエラーが見れればねぇ…。

念のために聞きますが、BEGINのやつは消したんですよね?


なな [WriteDate : Wed Apr 18 17:55:20 2001]

BEGINは消したっていまですか?
今はもう消してます。

エラーみるのは管理者にお願いしなければならないのですねぇ。
はぁ、しかし、なぜなんでしょうね〜?(-_-)うーむですねぇ。


ちゃいぱ [WriteDate : Wed Apr 18 19:55:58 2001]

こういう場合は、DOSプロンプトから実行すると、案外簡単にわかる場合があります。
ですので、この際、パールをPCへインストールしてみれば、いかがなものでしょう。
だいたいは、漢字のスペースが入っていたり、「;」が抜けていたりが多いです。


D.D. [WriteDate : Wed Apr 18 20:11:29 2001]

余談

>CGI(Perl)では、alert()のようなことはできません。
CGI 経由では無理ってことだろうけど、Perl を使ってやることは可能だな。
ま、JavaScript でやった方がいいだろうけど。


Nobu3 [MAIL] [URL] [WriteDate : Thu Apr 19 00:41:03 2001]

>CGI 経由では無理ってことだろうけど、Perl を使ってやることは可能だな。
興味ありです>D.D氏
是非教えてください。って、ここで言うのはあれですか?(謎)


なな [WriteDate : Thu Apr 19 10:50:26 2001]

???
D.Dさん Nobu3さん>なにか良い方法が見つかったら教えてくださいませ!
ひよっこなので、呑み込みが遅いかもしれませんが・・・。

>ちゃいぱさん、私KENTさんの自宅マシンWWWサーバ化計画しか
やったことないのですが、DOSでどうやったら動かせるのですか?


なな [WriteDate : Fri Apr 20 17:21:36 2001]

プログラムのスペースなどの見直しをしたところ
きちんと動きました!
何が悪かったのかははっきりしませんが、ちゃいぱさんのいうとおり
なにか余計な文字が入っていたのだと思います。

みなさんどうもありがとうございました!特にNobu3さんには本当に
お世話になりました。とてもうれしいです。
また何かありましたら、よろしくお願い致します。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]