#!/usr/bin/perl # プロトタイプ掲示板 Version1.10 # # 2000/10/13 宍戸 輝光 # # 設置方法 # pbbs.cgiとjcode.plを同じディレクトリにアスキーで転送し # pbbs.cgiの属性を755などCGIとして実行できるものにする。 # 次に、pbbs.cgiと同じディレクトリにpbbs.datという空ファ # イルを作成(内容のないファイルを転送しても良い)して、 # 666など書き込み可の属性にする。これで、pbbs.cgiを開くと # 掲示板として利用できるようになる。 # # 注意 # このスクリプトは実用性を無視したサンプルです。ファイル # のロックもしていないので、同時に複数の書き込みがあった # 時などにはデータが失われる可能性があります。利用する時 # には、このまま使うのではなく、いろいろな機能を追加して # いくプロトタイプとしてご利用ください。 require "jcode.pl"; # postされたデータを読み込む read(STDIN,$query,$ENV{'CONTENT_LENGTH'}); @indata=split(/&/,$query); foreach $body(@indata) { ($name,$val)=split(/=/,$body); $val=~ tr/+/ /; # データをデコード $val=~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C",hex($1))/eg; &jcode'convert(*val,"sjis"); $val=~ s//>/g; $val=~ s/\t//g; # タブ削除 $form{$name}=$val; } $mode=$form{'mode'}+0; $start=$form{'start'}+0; $dfile="pbbs.dat"; # データファイル $ret="../index.html"; # 「戻る」でリンクするパス $cgi="pbbs.cgi"; # スクリプトファイル $num=3; # 表示件数 # データファイルの記録項目 @dname=('no','date','name','mail','http','title','comment'); print "Content-type: text/html\n\n"; if (!(-e $dfile)) { print "\n\n\n"; print "

データファイルが見つかりません。

\n\n"; print "\n\n"; exit; } if ($mode==2) { # 登録処理 if ($form{'name'} eq "" || $form{'comment'} eq "" || $form{'title'} eq "") { print "\n\n\n"; print "

お名前とタイトル・本文は必須です。

\n\n"; print "\n\n"; exit; } ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday)=localtime(time); $year+=1900; $mon++; # 記録データを作成 $data{'date'}=sprintf("%04d/%2d/%2d-%02d:%02d:%02d",$year,$mon,$mday,$hour,$min,$sec); $data{'name'}=$form{'name'}; $data{'mail'}=$form{'mail'}; $data{'http'}=$form{'http'}; $data{'title'}=$form{'title'}; $data{'comment'}=$form{'comment'}; $data{'comment'}=~ s/\r\n/; truncate(F,0); seek(F,0,0); # データ番号を計算 if ($dat[0] eq '') { $no=1; } else { @mem=split(/\t/,$dat[0]); $no=$mem[0]+1; } $data{'no'}=$no; # データ項目配列@dnameを基に記録する文字列を作成 for ($i=0;$i<@dname;$i++) { $name="$dname[$i]"; $str="$str$data{$name}\t"; } print F "$str\n"; print F @dat; close(F); } # データ読みこみ open(F,$dfile); @dat=; close(F); $len=@dat; $end=$start+$num; # 表示範囲を計算 if ($len<$num) { $start=0; $end=$len; } elsif ($end>$len) { $end=$len; } # 書き込み表示用フォーマット $mfrm= <_date:
_no:. _title:
投稿者:_name:_mail:_http:
_comment:

MES_FORMAT for ($i=$start;$i<$end;$i++) { # 書き込み表示用文字列作成 $item=$mfrm; # 1件分のタブ区切りデータを分離して配列に入れる @mem=split(/\t/,$dat[$i]); # 1件分の表示用文字列を作成 for ($j=0;$j<@dname;$j++) { if ($dname[$j] eq 'mail' && $mem[$j] ne '') { $mem[$j]=" <$mem[$j]>"; } if ($dname[$j] eq 'http' && $mem[$j] ne '') { $mem[$j]=" $mem[$j]"; } if ($dname[$j] eq 'comment') { $mem[$j]=~ s/\n\n"; if ($start>0) { # 表示位置移動ボタン作成 $str="前の$num件"; $st=$start-$num; if ($st<0) { $st=0; } $mes="$mes
\n"; $mes="$mes\n"; $mes="$mes\n"; $mes="$mes\n"; $mes="$mes
\n"; } if ($len>$start+$num) { $str="次の$num件"; $mes="$mes
\n"; $mes="$mes\n"; $mes="$mes\n"; $mes="$mes\n"; $mes="$mes
\n"; } $mes="$mes\n"; if ($len==0) { $mes="$mes

データなし

\n"; } else { $start=$start+1; if ($start!=$end) { $mes="$mes

全$len件、$start〜$end件目

\n"; } else { $mes="$mes

全$len件、$end件目

\n"; } } # 掲示板HTML表示フォーマット $html= < プロトタイプ掲示板

プロトタイプ掲示板

お名前
メール
ホームページ
題名
コメント(改行有効・タグ無効)
_messages:

_ret:

END_OF_DATA $ret="戻る"; # フォーマット文字列を置換して表示用文字列作成 $html=~ s/_cgi:/$cgi/g; $html=~ s/_messages:/$mes/g; $html=~ s/_ret:/$ret/g; print $html;