CGI-BBS > 情報収集 > フォームメール > WebFORMのCGIの一部内容が知りたいのですが。


カレッヂ
カレッヂ


質問者 フランク  投稿日 5/1(水) 15:39:59
こんにちわ。
こちらのフォームメールCGIをダウンロードして使おうと思っておりますが、一部CGIの中で何をやっているのかわからないところがありまして、ご質問いたしました。

*****
#データ入力
if ($ENV{'REQUEST_METHOD'} ne "POST") { &error('エラー','標準入力 METHOD=POST を設定してください.<br>&lt;form method=post action=........&gt;'); }
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
if ($buffer eq '') { &error('エラー','このCGIは直接起動されません.'); }
$ref = $ENV{'HTTP_REFERER'};
$buffer2 = $ENV{'QUERY_STRING'};
if ($buffer2 ne '') { &error('エラー','標準入力 METHOD=POST に設定してください.<br>&lt;form method=post action=........&gt;'); }

#デコード
@pairs = split(/&/,$buffer);
foreach $pair (@pairs) {

        ($name,$value) = split(/=/,$pair);
        $value =~ tr/+/ /;
        $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
        $name =~ tr/+/ /;
        $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;

        &jcode'convert(*name,'sjis'); &jcode'convert(*value,'sjis');

        if ($value =~ /\r\n/) { $value =~ s/\r//g; }
        elsif ($value =~ /\r/) { $value =~ s/\r/\n/g; }

        if ($name eq "location") { $lct = $value; }
        elsif ($name eq "c_copy" && $value eq "on") { $cc = "on"; }
        elsif ($name eq "no_check" && $value eq "on") { $nocheck = "on"; }
        elsif ($name eq "space_check" && $value eq "on") { $spcheck = "on"; }
        elsif ($name eq "no_check") { ; }
        elsif ($name eq "ref_url") { $ref_url = $value; }
        elsif ($name eq "ref_name") { $ref_name = $value; }
        elsif ($name eq "subject" && $value ne "") { $subject = $value; }
        elsif ($name eq "subject") { ; }
        elsif ($name eq "ref_page") { $ref = $value; }
        elsif ($name eq "password") {

                $password = $value;
                push(@DATA_N,$name);
                push(@DATA_V,$value);
        }
        else {

                if ($name =~ /^email/i || $name =~ /^e\-mail/i) {

                        $value =~ s/ / /g;
                        if ($value =~ / / || $value =~ /;/) { $value = ""; }
                        if (!($value =~ /(.*)\@(.*)\.(.*)/)) { $value = ""; }

                        $email = $value;
                }

                push(@DATA_N,$name); push(@DATA_V,$value);

                $name =~ s/\</&lt;/g; $value =~ s/\</&lt;/g;
                $name =~ s/\>/&gt;/g; $value =~ s/\>/&gt;/g;
                $name =~ s/\"/&quot;/g; $value =~ s/\"/&quot;/g;
                push(@DATA_NS,$name); push(@DATA_VS,$value);
        }
}

********
上記部分は、何に対して何を行っているのでしょうか?一文一文の解説でなくて良いので、全体が何をする為に必要なのかわかりたいところです。

また、
********
#入力チェック
if (!$mailcheck && $email eq '') { &error('Eメールを入力してください',''); }
********
の、!$mailcheckとは、どういう状態のことをいうのですか?!で否定するということで、$mailcheckが指定のないとき、、、ということでしょうか?

まったくの初心者なのでCGI&Perlのリファレンスを読んでいるのですが、よくわかりません。
どなたかお教えください。宜しくお願いいたします。
回答者 しあわせのツボ  [削除]  投稿日 5/1(水) 17:29:08
ブラウザから送られたデータをデコードし配列に代入していく、基本的な部分です。
ただ、最後にハッシュでなく配列に格納しているのと、
真ん中へん(elsifが並んでいるあたり)でついでの作業をさせているため、
一般的なコードとは異なった形になっています。
# レスキューさんが何年も前に書いたままになっているので、多少冗長かもしれません。

!は論理否定で、真なら偽、偽なら真にひっくり返す作用があります。
Perlにとって変数の真偽は「0か""(空白)なら偽、それ以外は真」です。
この場合、$mailcheckが偽(で$emailが空白)の時にif文を実行させたいので、!によって真偽を入れ替えてやる必要がある訳です。
質問者 フランク  [削除]  投稿日 5/1(水) 17:53:44
しあわせのつぼさん、有り難うございます。

!についても良くわからなかったので、随分とあのCGIについてわかりました。

もう一つ、内容確認をする部分のhtmlタグ中に、
<form method=\"post\" action=\"webform.cgi\">
とあり、さっき質問したのと同じCGIをそのCGI中で呼び出しているようなのですが、こういうことをするとループにならないのですか?
webform.cgiのなかで、webform.cgiを呼び出しているということが理解できません。。。
回答者 しあわせのツボ  [削除]  投稿日 5/1(水) 19:26:06
呼び出すためのHTMLを出力しているだけなので、利用者が実際にそのリンクを使うまでは呼び出されません。

確認したものを「これでOKだよ」と利用者が伝える相手は誰ですか? webformですよね。
なので、もう一度webformを呼び戻す必要がある訳です。
質問者 フランク  [削除]  投稿日 5/2(木) 09:15:18
しあわせのつぼさん、たびたびわかりやすくご説明いただき有り難うございます!

なーるほど、そうかと思いました。

勉強になりました。

また何かありましたらどうぞ宜しくお願いします!

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

Web裏技