PerlのIF関数が動作しません。
[上に]
[前に]
[次に]
Weasel
2000/03/02(木) 14:59:18
いつも楽しく拝見しています。
Perlについて質問があります。
とほほさんのメール送信フォームを改造して、
アンケート用のメール送信CGIを制作しています。
その中で空白項目をチェックする機能を追加したのですが
何度やってもエラー画面しか表示されません。
ソースは下記の通りです。
if ($FORM{'nickname'} eq "") {
&error;
} else {
&send_data;
}
サブルーチン「sub error」でエラー画面を表示
(print "Location: http://www.hoge.co.jp/error.html)
sub send_dataで、とほほさんのwwwmail.cgiのメール送信
機能を使う、といった感じです。
しかし、何度やってもエラー画面しか表示されません。
sub send_dataの出力がおかしいのかな、と思い、デバック用に
$toko_data = "$FORM{'nickname'}";として
その変数を書き出すようにしましたが、やはりエラー画面しか
表示されないようです。
ifの構文は、始めは書籍を見て入力してダメだったので、
とほほさんのリファレンスからコピーペーストして、
必要な箇所だけ書き換えました。(タイプミスを防ぐため)
以上、よろしくお願いいたします。
ラウォッチ
2000/03/02(木) 15:10:53
フォームのエレメント名に間違いはありませんか?
例、<INPUT TYPE="text" NAME="nickname">と$FORM{'nickname'}のnicknameはスペル間違いないですか?
EMI
2000/03/02(木) 15:40:58
ちょっとつっこみ。
ifは関数ではありません。Perlの制御構造です。
それから、Perlは大文字小文字を区別するのでifをIFと書いてはいけません。(このトピックのタイトル)
Weasel
2000/03/02(木) 16:23:56
コメント、ありがとうございます。
> フォームのエレメント名に間違いはありませんか?
確認しましたが、合っています。
(念のためコピーペーストして再度検証しましたが同じです)
> ifは関数ではありません。Perlの制御構造です。
すみません。Excelやファイルメーカーでifを知ったので、
つい間違えてしまいました。
その他検証したこと
・perl-wcでデバック済み
・改行コードはUnixです。
・jcode.plやminew.plは同じ階層に入ってます。
・パーミッションは設定してあります。
・wwwmail.cgiの自己診断機能でチェックしてあります。
・sendmailへのパスなどはOKのはずです。
(ifでつまずいているので、深く検証していないです)
この文章を書いていて、ふと思ったのですが、
if ($FORM{'nickname'} eq "") {
この部分が問題ではないかと、、、
一度、変数に取り込んだほうがいいかな、って
ちょっと検証してみます。
Weasel
2000/03/02(木) 16:28:56
$nickname = "$FORM{'nickname'}";
if ($nickname eq "") {
&error;
} else {
&send_data;
}
としましたが、やはりエラー画面が表示されます。
たれ
2000/03/02(木) 16:29:56
もしやとは思いますが、デコード作業を行っていないということは
ないでしょうか?
ifの前までに%FORMが作られていなければ.....
>この文章を書いていて、ふと思ったのですが、
>if ($FORM{'nickname'} eq "") {
>この部分が問題ではないかと、、、
>一度、変数に取り込んだほうがいいかな、って
あんまり関係ないです。
個人的に大元の値をいじくり回すのが好きくないので
一度別の変数に代入する方法を私はとってますけど。
Weasel
2000/03/02(木) 16:49:39
> もしやとは思いますが、デコード作業を行っていないということは
> ないでしょうか?
デコードとは、
$nickname = "$FORM{'nickname'}";
&jcode'convert(*nickname, "jis");
でよろしいのでしょうか?
空白か、そうでないか、というチェックだったので
デコードは必要ないと考えていたのですが、
やはり必要なのでしょうか?
EMI
2000/03/02(木) 16:53:31
いえ、フォームデコードです。
http://www.tohoho-web.com/wwwcgi3.htm#CgiEncode
たれ
2000/03/02(木) 16:54:18
ええっと、ブラウザからもらってくるデータが、そのまま
%FORMに組み込まれるわけではありません。
GETの場合は$ENV{'QUERY_STRING'}
POSTの場合は標準入力
に、値が入っているわけです。
厳密に言うと、デコード作業ではなく
変数に組み込む作業なのですが.....
これくらいの解説でよろしいでしょうか?
ラウォッチ
2000/03/02(木) 16:58:39
たれさんの以下に1票!
>デコード作業を行っていないということはないでしょうか?
ラウォッチ
2000/03/02(木) 17:06:51
おー、ソース見ていた間に...。ピエロになってしまった。
nicknameに対しても以下のnemeと同じ様な処理(URLデコード)が必要です。
$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);
}
Weasel
2000/03/03(金) 05:09:12
ありがとうございます。解決しました。
根本的な問題は、とほほさんのwwwmail.cgiと参考書の
例題をコピーペーストで利用しようとしたことでした。
デコードについて調べるうちに、Perlのライブラリで
対応できることに気付きました。
> require "cgi-lib.pl";
> require "jcode.pl";
> require "mimew.pl";
> &ReadParse;
> $nickname = $in{"nickname"};
> &jcode'convert(*nickname,"jis");
> if ($nickname eq ""){
> &error_page;
> }else{
> &send_data;
> }
> sub error_page{
> print "Location: http://www.hoge.co.jp/error.html\n\n";
> exit;
> }
> sub send_data{
> 〜〜メール処理〜〜
> print "Location: http://www.hoge.co.jp/thanks.html\n\n";
> exit;
> }
こんな感じです。
貴重なアドバイスをいただき、皆様には心より
感謝申し上げます。
[上に]
[前に]
[次に]