掲示板
#! /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;
〔 実行する 〕