Free CGI Perl PHP Script Olive Design CGI

一言メッセージ掲示板 その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";
}
Perl PHP Free CGI Script OliveDesign CGI

Perl PHP Free CGI Script OliveDesign CGI

プライバシーポリシー / 特定商取引法に基づく表示