プログラム質問箱への投稿
記事番号00580へのフォローを投稿します。
引用記事中のHTMLをエスケープせずに
そのまま引用
することも出来ます。
お名前(ペンネイムで結構ですが必要です)
(
ブラウザに個人情報を覚えさせない)
電子メイルアドレス(必要です)
題名(必要です)
Home Page がある方はリンク希望先の URL を記載して下さい
会議室に載せたい内容を以下へお書き下さい (
HTMLを解釈せずにそのまま表示)
1月18日に、三葉工房の管理者さんは書きました。 >また,つまづいた点がありましたので,連続的に書き込んでよろしいでしょうか。 >本当にすみません。 > >実は,今まで,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__ >
ホームペーヂに戻る
nir@mvg.biglobe.ne.jp
Last Update: 2 December 1999