新規記事投稿 フォロー記事投稿 記事のキャンセル
From: 三葉工房の管理者 <nature-create@amy.hi-ho.ne.jp>
Subject: 絶対的な番狂わせ!フォームからの情報が渡せません。
Date: 1999/01/18 16:46:42

また,つまづいた点がありましたので,連続的に書き込んでよろしいでしょうか。
本当にすみません。

実は,今まで,cgi-libを利用して掲示板を開発していましたが,同一スクリプト内
においてのリンク設定に成功出来なかったので,cgi-libを外して,jcode.plに取り替えた
ら,cgi-libのReadPaseと言うサブルーチンがフォームから発信されたフォームタグネーム
を$in{' '}を支えていたおかげて,フォーム情報をcgiに渡していましたが,今度は,
jcode.plに変更した以上,ReadPaseと言う後ろ楯が消えたので,自分で設定しなければ
なりません。
そこで,ネット上からフォームを利用したスクリプトをダウンロードして,その構文を
参考にスクリプトを作成しましたが,トップページや従来の書き込みは,実行出来るものの
サブミットをするとフォームからの情報を渡す事が出来なくなりサーバーエラーにされてしまいます。
色々と,ダウンロードして,既にサーバー上で実行が確認されているスクリプトと自分の
スクリプトを照らし合わしてもおかしい箇所は見つかりません。

本来,以下の様に設定すれば,フォームからの情報を$in{' '}で当然渡せるはずでは
ないでしょうか。
if($ENV{'REQUEST_METHOD'} eq 'GET')
{
@pairs=split(/&/,$ENV{'QUERY_STRING'});}
elsif($ENV{'REQUEST_METHOD'} eq 'POST')
{read (STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
@pairs=split(/&/,$buffer);
}
else{&noname;
}

foreach $pair (@pairs)
{
($name,$value)=split(/=/,$pair);
$name=~tr/+/ /;
$value=~tr/+/ /;
$value=~s/  / /g;
$name=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
$value=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
$value=~tr/+/ /;
$value=~s/<!--(.|\n)*-->//g;
$value=~s/<html(.|\n)*//ig;
$value=~s/<script(.|\n)*//ig;
$value=~s/<table(.|\n)*//ig;
$value=~s/<form(.|\n)*//ig;
$value=~s/<html(.|\n)*//ig;
$value=~s/<xmp(.|\n)*//ig;
$value=~s/\r\n/<br>//g;
$value=~s/\r/<br>//g;
$value=~s/\n/<br>//g;
&jcode'convert(*value,'sjis');
&jcode'convert(*name,'sjis');
$in{$name}=$value;
}
とのスクリプトを見ても上記の様に記述しています。
ですから,私もその様に記述したのに関わらず,当然エラーは起こらないはずなのに
もう奇蹟的にサブミットボタンを押すとフォームのinputタグと$in{$name}の関連が
なおかつ結ばれていないらくサーバーエラーにされてしまいます。
どうして,上記の様な書き方でもエラーにされてしまうのでしょうか。
上記の様に記述してサブミットすればサーバーエラーなんか起こるはずはないのですが。
つまり,可笑しい箇所がないのにサーバーエラーなのです。

次に,ついでに質問したいのですが,同一スクリプト内においてリンクをする場合,
(例えば,トップページから変更.訂正のページへ行くと言う感じ)で,私は,ある方の
スクリプトを参照に
if($in{'action'} eq $repage){&rever;}
urlの書き方=golygth.cgi?action=repage
(&reverには,そのリンクしたページのhtml文が記述されています。)
と言う形の書き方をしたのですが,cgi-libでもリンクしたページは,サーバーエラーでした。
もし,同一スクリプト内においてリンクしたい場合は,どのように書けば,よろしいのでしょうか。

もちろん,問題のスクリプトを下部にコピーして,リンク先には,そのスクリプトのパスを書き込んでリンク出来る
様にします。

お忙しい所,いろいろと質問攻めで済みません。独学で,perlに詳しい人がいないもので。

perlには,真剣な熱意に自信がございます。どうか,アドバイス宜しくお願い申し上げます。
問題スクリプト=golygth.cgi
=============

#!/usr/local/bin/perl
$|=1;
require './jcode.pl';

($sec,$min,$hour,$day,$mon,$year,$wday)=localtime(time);
$mon++;
$seirei=($year+1900);
$wareki=($year-88);
$BaseDir = "$ENV{'HOME'}/html/search";
$NEWURL="http://www.amy.hi-ho.ne.jp/cgi-bin/user/nature-create/golygth.cgi";
$coment=$in{'coment'};
$yourname=$in{'yourname'};
$mail=$in{'mail'};
$gurl=$in{'gurl'};
$hpagename=$in{'hpagename'};
$newmg="newmg.dat";
@week=("日","月","火","水","木","金","土");
$yobi=$week[$wday];
if($man<10){$mon="0$mon";}
if($day<10){$day="0$day";}
if($hour<10){$hour="0$hour";}
if($min<10){$min="0$min";}
if($sec<10){$min="0$sec";}
$date="$seirei年(平成$wareki年)$mon月$day日  $yobi曜日$hour時$min分$sec秒";
#最高コメント数制限
$maxcment="105";
#最低コメント数制限
$remaxcment="52";
#過剰コメント不足の最大数値
$mostsmall="28";
#過剰コメント超過の最小数値
$mostbig="128";
#過剰コメント不足の差不足設定エラー数値下限
$ersnall=($remaxcment-20);
#過剰コメント超過の差不足設定エラー数値上限
$erbig=($maxcment+20);
$dbsmall=($remaxcment-$ersnall);
$dbbig=($erbig-$maxcment);
if($mostsmall>$ersnall){print <<"MOTER";
Content-type: text/html

<html><head><title>過剰コメント不足エラー</title></head>
<body bgcolor=\"#ccffff\">
<center><font color=\"#550000\" size=6><b>過剰コメント不足エラー</b></font></center><p><font color=\"#000055\" size=5><b>過剰コメント不足の最低基準値$remaxcmentとの差が$dbsmall以内です。</b></font><p><center><font color=\"#663300\" size=5><b>適切な数値に書き直して下さい!</b></font></center></body></html>
MOTER
exit;
}
if($mostbig<$erbig){print <<"REMOTER";
Content-type: text/html

<html><head><title>過剰コメント超過エラー</title></head>
<body bgcolor=\"#ffff99\">
<center><font color=\"#550000\" size=6><b>過剰コメント超過エラー</b></font></center><p><font color=\"#000055\" size=5><b>過剰コメント超過の最大基準値$maxcmentとの差が$dbbig以内です。</b></font><p><center><font color=\"#663300\" size=5><b>適切な数値に書き直して下さい!</b></font></center></body></html>
REMOTER
exit;
}
$smallloss=$remaxcment-$mostsmall;
$bigloss=$mostbig-$maxcment;
$wordcnt=length($in{'coment'});
$wordbit=($wordcnt/2);
$overtop=($wordbit-$maxcment);
$overdown=($remaxcment-$wordbit);
$pope="登録";
#1を選択で新規記事は,リスト最上段,それ以外は,リスト最下段
$enty="1";
#一度に掲載する記事数
$maxmsg="4";
$repage="repage";

if($ENV{'REQUEST_METHOD'} eq 'GET')
{
@pairs=split(/&/,$ENV{'QUERY_STRING'});}
elsif($ENV{'REQUEST_METHOD'} eq 'POST')
{read (STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
@pairs=split(/&/,$buffer);
}
else{&noname;
}

foreach $pair (@pairs)
{
($name,$value)=split(/=/,$pair);
$name=~tr/+/ /;
$value=~tr/+/ /;
$value=~s/  / /g;
$name=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
$value=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
$value=~tr/+/ /;
$value=~s/<!--(.|\n)*-->//g;
$value=~s/<html(.|\n)*//ig;
$value=~s/<script(.|\n)*//ig;
$value=~s/<table(.|\n)*//ig;
$value=~s/<form(.|\n)*//ig;
$value=~s/<html(.|\n)*//ig;
$value=~s/<xmp(.|\n)*//ig;
$value=~s/\r\n/<br>//g;
$value=~s/\r/<br>//g;
$value=~s/\n/<br>//g;
&jcode'convert(*value,'sjis');
&jcode'convert(*name,'sjis');
$in{$name}=$value;
}

if ($in{'submit'} eq $pope) {
&check;
&toppage;

}
else {&toppage;}
if($in{'action'} eq $repage){&rever;}

sub toppage{

open (SSTBOOK, "$BaseDir/$newmg") ||die "ファイルが開きません!\n,
何処かの構文が間違っています!";
@Data=<SSTBOOK>;
close SSTBOOK;
$cnturl=@Data;

print "Content-type: text/html\n\n";

print "<html>\n";
print "<head>\n";
print "<title>進性能掲示板(V-up.スクリプト)</title>\n";
print "</head>\n";
print "<body bgcolor=\"orange\">\n";
print "<p>\n";
print "<table bgcolor=\"black\" border=5>\n";
print "<tr>\n";
print "<th>\n";
print "<font color=\"orange\"size=5>\n";
print "<b>進性能掲示板(V-up.スクリプト)</b>\n";
print "</font>\n";
print "</th>\n";
print "</tr>\n";
print "<tr>\n";
print "<td>\n";
print "<font color=\"yellow\"size=4>(注意!)此の試験実行掲示板のコメント文字数は,$remaxcment文字以上$maxcment文字以内の範囲に制限されていますので,その範囲内の文字数で御記入願います。<br>
現在時刻:$date</font>\n";
print "</td>\n";
print "</tr>\n";
print "<tr>\n";
print "<th>\n";
print "<center>\n";
print "<a href=\"/nature-create/search/index.html\">\n";
print "<font color=\"yellow\"size=4>MISTUBA SEARCHPAGE</font>\n";
print "</a>\n";
print "</center>\n";
print "</th>\n";
print "</tr>\n";
print "<tr>\n";
print "<th>\n";
print "<center>\n";
print "<a href=\"/cgi-bin/user/nature-create/golygth.cgi?action=repage\">\n";
print "<font color=\"yellow\"size=4>変更.削除</font>\n";
print "</a>\n";
print "</center>\n";
print "</th>\n";
print "</tr>\n";
print "</table>\n";
print "</center>\n";
print "<p>\n";
print "<form method=POST action=\"golygth.cgi\" >\n";
print "<p>\n";
print "<table bgcolor=\"#ffcc99\" border=5>\n";
print "<tr>\n";
print "<th>\n";
print "<font color=\"navy\"size=4>\n";
print "<b>登録者名</b>\n";
print "</font>\n";
print "</th>\n";
print "</tr>\n";
print "</table>\n";
print "<p>\n";
print "<input name=\"yourname\" size=45>\n";
print "<p>\n";
print "<table bgcolor=\"#ffcc99\" border=5>\n";
print "<tr>\n";
print "<th>\n";
print "<font color=\"navy\"size=4>\n";
print "<b>Eメールアドレス</b>\n";
print "</font>\n";
print "</th>\n";
print "</tr>\n";
print "</table>\n";
print "<p>\n";
print "<input name=\"mail\" size=45>\n";
print "<p>\n";
print "<table bgcolor=\"#ffcc99\" border=5>\n";
print "<tr>\n";
print "<th>\n";
print "<font color=\"navy\"size=4>\n";
print "<b>登録者のホームページ名</b>\n";
print "</font>\n";
print "</th>\n";
print "</tr>\n";
print "</table>\n";
print "<p>\n";
print "<input name=\"hpagename\" size=60>\n";
print "<p>\n";
print "<table bgcolor=\"#ffcc99\" border=5>\n";
print "<tr>\n";
print "<th>\n";
print "<font color=\"navy\"size=4>\n";
print "<b>ホームページのURL</b>\n";
print "</font>\n";
print "</th>\n";
print "</tr>\n";
print "</table>\n";
print "<p>\n";
print "<input name=\"gurl\" value=\"http://\" value=size=60>\n";
print "<p>\n";
print "<table bgcolor=\"#ffcc99\" border=5>\n";
print "<tr>\n";
print "<th>\n";
print "<font color=\"navy\"size=4>\n";
print "<b>コメント</b>\n";
print "</font>\n";
print "</th>\n";
print "</tr>\n";
print "</table>\n";
print "<p>\n";
print "<textarea name=\"coment\" rows=4 cols=60 wrap=\"soft\"></textarea>\n";
print "<p>\n";
print "<center>\n";
print "<input type=submit name=\"submit\" value=\"登録\">\n";
print "<p>\n";
print "<input type=reset value=\"リセット\">\n";
print "</center>\n";
print "</form>\n";
print "<hr size=5>\n";
print "<center>\n";
print "<font color=\"#330066\" size=5>\n";
print "<b>此れ迄の書き込み:$cnturl件が登録されています。</b>\n";
print "</font>\n";
print "</center>\n";
print "<hr size=5>\n";
if($enty eq "0"){@Data=reverse(@Data);}
foreach $match(@Data){
@catchin=split(/&&/,$match);
print "<a href=\"mailto:$catchin[0]\">\n";
print "<font color=\"#006600\" size=4>$catchin[1]</font>\n";
print "</a>\n";
print "<font color=\"#000066\" size=3>:$catchin[2]</font>\n";
print "<br>\n";
print "<a href=\"$catchin[3]\" target=\"new\">\n";
print "<font color=\"#990066\" size=3>$catchin[4]</font>\n";
print "</a>\n";
print "<br>\n";
print "<font color=\"#330000\" size=3>$catchin[5]</font>";
print "<hr size=5>\n";
}
print "</body>\n";
print "</html>\n";

}
sub rever{
print <<"MARCAR";
Content-type: text/html

<html><head><title>変更.削除ROOM</title></head>
<body bgcolor=\"#00ff00\">
<center><font color=\"#550000\" size=6><b>変更.削除ROOM</b></font></center><p>
<font color=\"#000055\" size=5><b>今は,テスト中です。暫くお待ち願います!</b></font><p><center><a href=\"golygth.cgi\"><font color=\"#663300\" size=5><b>掲示板へ戻る</b></font></a></center></body></html>
MARCAR
exit;}


sub check{
if ($in{'yourname'} eq "") {&noname;}
sub noname{print <<"NONAME";
Content-type: text/html

<html><head><title>名前が記入されていません!</title></head>
<body bgcolor=\"#ffffcc\">
<center><font color=\"#550000\" size=6><b>名前が記入されていません!</b></font></center><p><font color=\"#000055\" size=5><b>名前をフォームに記入為無ければ登録出来ません。</b></font><p><center><a href=\"golygth.cgi\"><font color=\"#663300\" size=5><b>掲示板へ戻る</b></font></a></center></body></html>
NONAME
 exit;
}

if($wordbit>$mostbig){print <<"MOROVER";
Content-type: text/html

<html><head><title>かなりコメント数が$overtop個もオーバーしました!</title></head>
<body bgcolor=\"\#cc0000\">
<font color=\"\#ffff66\" size=5><b>彼方の記入されたコメント数は $wordbit個で,当フォームは,基準値の$remaxcment~$maxcment個よりコメント数が$bigloss個以上も多い場合に時に当ページが出力されてしまいます。</b>
</font><p>
<font color=\"\#ccffcc\" size=5>そのコメント数は基準の$remaxcment~$maxcment個に$overtop個ものかなりのオーバーです。 </font>
</body></html>
MOROVER
exit;}
if($wordbit>$maxcment){ print <<"OVER";
Content-type: text/html

<html><head><title>コメント数が$overtop個越えています!</title></head>
<body bgcolor=\"\#003399\">
<font color=\"\#ffff66\" size=5><b>彼方の記入されたコメント数は $wordbit個です。</b>
</font><p>
<font color=\"\#ccffcc\" size=5>そのコメント数は基準の$remaxcment~$maxcment個より$overtop個オーバーしています。</font>
</body></html>
OVER
exit;}

if($wordbit>0){if($wordbit<$mostsmall){print <<"MORDOWN";
Content-type: text/html

<html><head><title>かなりコメント数が$overdown個も足りません!</title></head>
<body bgcolor=\"\#110000\">
<font color=\"\#ffff66\" size=5><b>彼方の記入されたコメント数は $wordbit個で,当フォームは,基準値の$remaxcment~$maxcment個よりコメント数が$smallloss個以上も少ない時に当ページが出力されてしまいます。</b>
</font><p>
<font color=\"\#ccffcc\" size=5>そのコメント数は基準の$remaxcment~$maxcment個に$overdown個ものかなりの不足です。 </font>
</body></html>
MORDOWN
exit;}

if($wordbit<$remaxcment){print <<"DOWN";
Content-type: text/html

<html><head><title>コメント数が$overdown個足りません!</title></head>
<body bgcolor=\"\#660000\">
<font color=\"\#ffff66\" size=5><b>彼方の記入されたコメント数は $wordbit個です。</b>
</font><p>
<font color=\"\#ccffcc\" size=5>そのコメント数は基準の$remaxcment~$maxcment個に$overdown個不足しています。 </font>
</body></html>
DOWN
exit;}
}

elsif ($in{'coment'} eq ""){print <<"NOCMT";
Content-type: text/html

<html><head><title>コメントが記入されていません!</title></head>
<body bgcolor=\"#ffffcc\">
<center><font color=\"#550000\" size=6><b>コメントが記入されていません!</b></font></center><p><font color=\"#000055\" size=5><b>コメントをフォームに記入為無ければ登録出来ません。</b></font><p><center><a href=\"golygth.cgi\"><font color=\"#663300\" size=5><b>掲示板へ戻る</b></font></a></center></body></html>
NOCMT
 exit;}
$coment=~ s/\r\n/<br>/g;
$coment=~ s/\r/<br>/g;
$coment=~ s/\n/<br>/g;
&resit;
sub resit{
if(-e "$BaseDir/$newmg"){
open (SSTBOOK, ">>$BaseDir/$newmg") || die "ファイルが開きません!\n,
何処かの構文が間違っています!";
print SSTBOOK "$mail&&$yourname&&$date&&$gurl&&$hpagename&&$coment\n";
close SSTBOOK;}

#掲載メッセージの処理
if(-e "$BaseDir/$newmg"){open (NEW, "$BaseDir/$newmg") || die "ファイルが開きません!\n,
何処かの構文が間違っています!";
@lines=<NEW>;
close NEW;}
unshift(@lines,"$mail&&$yourname&&$date&&$gurl&&$hpagename&&$coment\n");
splice(@lines,$maxmsg);
open (NEW, ">$BaseDir/$newmg") || die "ファイルが開きません!\n,
何処かの構文が間違っています!";
flock(NEW,6);
foreach(@lines){
print NEW;}
close NEW;



print <<"REPLAY";
Content-type: text/html

<html><head><title>$in{'yourname'}さん:書き込みを御受け致しました。</title><meta http-equiv="refresh" content="5; url=$NEWURL "></head>
<body bgcolor=\"\#cc66ff\">
<font color=\"\#660000\" size=5><b>$in{'yourname'}さん,彼方の記入なされたコメント数は,$wordbit個でコメント数規定に合致しました。</b></font><br><font color=\"\#ffff66\" size=5><b>それに伴い書き込みを御受け致しました。どうもありがとうございました。</b>
</font><p>
<font color=\"\#ccffcc\" size=5>御帰りのページは<a href=\"$NEWURL \">こちら</a>でございます。</font>
</body></html>
REPLAY
exit;}
}
__END__