掲示板
#! /usr/local/bin/perl # 設定 $FILE = './dat/board.dat'; # 書き込み保存ファイル $MAX = 100; # 保存件数 $VIEW = 10; # 1ページの表示件数 $TEXTMAX = 1000; # 本文文字数制限(全角) $NAMEMAX = 10; # 名前文字数制限(全角) $TITLEMAX = 20; # 題名文字数制限(全角) $PASSWORD = '1234'; # 削除用パスワード # フォームデータ取り込み if($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); } else { $query = $ENV{'QUERY_STRING'}; } foreach $pair (split(/&/, $query)) { my ($key, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg; $value =~ s/&/&/g; $value =~ s/</</g; $value =~ s/>/>/g; $value =~ s/\x0D\x0A\s*/<br>/g; $value =~ s/\s+/ /; $FORM{$key} = $value; } # データ読み込み open(FILE, "<$FILE"); # データ読み込み eval{ flock(FILE, 1) }; @DATA = <FILE>; close FILE; if($FORM{'mode'}) { if($FORM{'mode'} eq 'write') { # データ追加 if($FORM{'text'} and length($FORM{'text'}) <= $TEXTMAX * 2 and length($FORM{'name'}) <= $NAMEMAX * 2 and length($FORM{'title'}) <= $TITLEMAX * 2 ) { my $tm = time; unshift @DATA, "$tm\t$FORM{'name'}\t$FORM{'title'}\t$FORM{'text'}\t\n"; while(@DATA > $MAX) { pop @DATA; } } } elsif($FORM{'mode'} eq 'delete') { # データ削除 if($FORM{'no'} ne "") { if($FORM{'pass'} eq $PASSWORD) { splice @DATA, $FORM{'no'}, 1; } } } #サンプルにつき書き込み停止 #open(FILE, ">$FILE"); # データ書き込み #eval{ flock(FILE, 2) }; #print FILE @DATA; #close FILE; } # HTML出力 print qq(Content-type: text/html; charset=Shift_JIS\n\n); print <<END; <html> <head> <title>掲示板</title> </head> <body bgcolor="#eeffee"> <center><h1 style="margin:2px;font-size:17px">掲 示 板</h1></center> <hr> <form action="$ENV{'SCRIPT_NAME'}" method="POST"> 名前:<input type="text" name="name" size="50" maxlength="$NAMEMAX" value="$FORM{'name'}"><br> <br> 題名:<input type="text" name="title" size="50" maxlength="$TITLEMAX"><br> <br> 本文: <small>※全角$TEXTMAX文字以内</small><br> <textarea name="text" rows="10" cols="70"></textarea><br> <br> <input type="hidden" name="mode" value="write"> <input type="submit" value=" 書き込み "><br> </form> <form action="$ENV{'SCRIPT_NAME'}" method="POST"> <hr> END # データの出力 $begin = $FORM{'next'}; $end = $begin + $VIEW; if($end > @DATA) { $end = @DATA; } for($i = $begin ; $i < $end ; ++$i) { my ($tm, $name, $title, $text) = split(/\t/, $DATA[$i]); my ($sec, $min, $hour, $date, $mon, $year, $day) = localtime($tm); if($name eq "") { $name = "名無し"; } if($title eq "") { $title = "無題"; } printf qq(<input type="radio" name="no" value="%d">), $i; print qq(<b>【$title】$name</b><br>); print qq($text<br>); printf qq(<div align="right">[%02d/%02d %02d:%02d]</div>), ++$mon, $date, $hour, $min; print qq(<hr>\n); } # 前ページ・次ページへのリンク print qq(<center>\n); if($FORM{'next'}) { printf qq(<a href="$ENV{'SCRIPT_NAME'}?next=%d">≪前ページ</a>\n), $FORM{'next'} - $VIEW; } if($end < @DATA) { print qq(<a href="$ENV{'SCRIPT_NAME'}?next=$end">次ページ≫</a><br>\n); } print qq(</center>\n); # HTML出力 print <<END; <div align="right"> <input type="password" name="pass" value="$FORM{'pass'}" size="4"> <input type="hidden" name="mode" value="delete"> <input type="hidden" name="next" value="$FORM{'next'}"> <input type="submit" value="削除"> </div> </form> </body> </html> END exit;
〔 実行する 〕