一言メッセージ掲示板 その3
上のスクリプトの掲示板に1ページ内で表示するコメント数を設定できる機能をつけてみました。
まず、ファイル名bbs03.cgiを作成し、下のソースを貼り付けてパーミションを755にします。 同じ階層に空のファイルlog.datを作成してパーミションを666にします。サンプル
ソース bbs03.cgi
#!/usr/bin/perl
#初期設定項目
#最大ログ保存数
$data_max = 50;
#このスクリプトの場所
$this = "./bbs03.cgi";
#ログファイルの場所
$logfile = "./log.dat";
#1ページのコメント表示数
$comsize = 10;
#メイン処理
&decode;
if ($mode eq 'regist'){ ®ist; }
elsif ($mode eq 'delete'){ &delete; }
&html;
#html表示
sub html{
#ログファイル読み込み
open(IN,"$logfile");
@log = <IN>;
close(IN);
print <<"HTML";
Content-type: text/html
<html><head><title>一言メッセージ</title></head>
<body>
<h3>一言メッセージを書いてください。</h3>
<form method="POST" action="$this">
<input type=hidden name=mode value="regist"><br>
入力 =>
<input type=text name="comment"><br>
<input type="submit" value="送信"></form><br>
HTML
#コメント部分の表示
$start = $page +1;
$end = $page + $comsize;
$i= 0;
foreach $in (@log){
$i++;
if($i < $start){ next;}
elsif ($i > $end ){ next;}
($num,$comment) = split(/ /,$in);
print "$num> $comment<br>";
}
&next;
print <<"END";
$next $back $rest
<br>
<form method="GET" action="$this">
<input type=hidden name=page value=$page>
<input type=hidden name=mode value=delete>
削除番号<input type=text name=no size=4>
<input type=submit value=削除></form>
</body></html>
END
exit;
}
#デコード処理
sub decode{
$method = $ENV{ 'REQUEST_METHOD' };
if( $method eq 'GET' ) {
$input = $ENV{ 'QUERY_STRING' };
}
else {
read( STDIN,$input,$ENV{ 'CONTENT_LENGTH' } );
}
@in = split(/&/,$input);
foreach (@in) {
($list, $value) = split(/=/);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
$form{$list} = $value;
}
$mode = $form{'mode'};
$comment = $form{'comment'};
$no = $form{'no'};
$page = $form{'page'};
}
#ログファイルに書き込み
sub regist{
open(IN,"$logfile");
@log = <IN>;
$no = $log[0] + 1 ;
$newdata = "$no $comment\n";
close(IN);
open(OUT,">$logfile");
unshift (@log,"$newdata");
#ログ保存数を設定($# は変数のインデックスの最大値を求める記述)
if ($#log > ($data_max -1)){ $#log = $data_max -1;};
print OUT @log;
close(OUT);
}
#ログファイルから削除
sub delete{
open(IN,"$logfile");
foreach (<IN>) {
($no,$comment) = split(/ /);
#削除ナンバー以外は保存
if (!($form{'no'} == $no)){ push(@log,$_); }
}
close(IN);
open(OUT,">$logfile");
print OUT @log;
close(OUT);
}
sub next {
$next_page = $page + $comsize;
$back_page = $page - $comsize;
$page_total = int( ($#log ) / $comsize )+1;
$page_rest = ($page / $comsize)+1;
if ($back_page >= 0){
$next = "<a href=bbs03.cgi?page=$back_page>前のページ</a>";
}
if ($next_page < $i){
$back = "<a href=bbs03.cgi?page=$next_page>次のページ</a>";
}
$rest = "$page_rest/$page_total";
}
|
