#!/usr/bin/perl
##################################################################
# Program : bbs.cgi(Perl)
# Date_written : 1999,09,03
# Author : 良寛
##################################################################
require './jcode.pl';
# ------------------------------------------------------------
# requireは'ファイル名'で指定した、サブルーチンライブラリ
# を、このプログラムの中に取り込む命令です。この場合、本プ
# ログラムと同じディレクトリにある、jcode.pl(フリーソフト)
# という日本語コード変換プログラムを取り込んで(結合して)
# 普通のサブルーチンのように使います。
# ------------------------------------------------------------
#=== 初期設定 ==================================================
$max = 20; # 最大ログ件数
$bbs_data = "bbs.dat"; # ログ用ファイル
$sys_data = "sys.dat"; # システム用ファイル(現在ログ数)
$bbs_title = "良寛の掲示板"; # 掲示板のタイトル
$bbs_addr ="http://www.minc.ne.jp/~ryokan/cgi-bin/lecture";
# # 掲示板を置いてあるディレクトリ
$homepage ="http://www.minc.ne.jp/~ryokan";
# # 戻り先のページ
# ------------------------------------------------------------
# 変数の初期値を設定します。トップに書いておくとメンテナンス
# が容易です。
# 1行目の「#!/usr/bin/perl」はサーバーのPerlのある場所
# です。プロバイダにより少し異なりますので、プロバイダに聞い
# て確かめてください。これは、ミンク(鹿児島のプロバイダ)の
# 場合です。
# ------------------------------------------------------------
#=== フォームデータの受信 ======================================
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}
else {
$buffer = $ENV{'QUERY_STRING'};
}
# ------------------------------------------------------------
# データの送信の方法には、POSTとGETがあります。POSTかGETか
# を知るには、環境変数$ENV{'REQUEST_METHOD'}という特殊な変
# 数を用います。
# POSTの場合、
# read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
# とすると、$bufferに$ENV{'CONTENT_LENGTH'}で得られる
# 長さのデータがSTDINから代入されます。
# GETの場合、
# $ENV{'QUERY_STRING'}から$bufferに代入されます。
#
# 本プログラムは、POSTで送信されるようになっていますが、
# 掲示板が表示された初期段階(投稿するボタンが押される前)
# では、GETが選択されています。
# ------------------------------------------------------------
#=== 受信データの編集 ==========================================
@buffer = split(/&/, $buffer);
# ------------------------------------------------------------
# $bufferの内容を文字「&」で分離し、配列@bufferに代入します。
# ------------------------------------------------------------
foreach $pair (@buffer) {
# ------------------------------------------------------------
# 配列@bufferの要素を一つずつ$pairに代入します。
# ------------------------------------------------------------
local($name, $value) = split(/=/, $pair);
# ------------------------------------------------------------
# $pairの内容を文字「=」で分離し、ローカル変数$nameと$value
# に代入します。
# ローカル変数というのは、そのブロック内だけで有効な変数で、
# ブロックの外で同じ変数名を用いても全く別なものになります。
# 通常、宣言しない変数はグローバル変数(全ての範囲で有効な
# 変数)になります。
# また、当然のことですが、本プログラムが表示された時点では、
# プログラムの実行は終了していますので、変数はクリアされて
# います。
# ------------------------------------------------------------
$name =~ tr/+/ /;
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
# ------------------------------------------------------------
# +をスペースに置き換え%のついた2桁のデータを16進に変換
# します。
# ------------------------------------------------------------
$value =~ s/</ig;
$value =~ s/>/>/ig;
# ------------------------------------------------------------
# タグの禁止です。タグ「< >」を表示用の記号に変えます。
# オプションのigは、大小文字にかかわらず全てと言う意味です。
# ------------------------------------------------------------
$value =~ s/\r\n/
/g;
$value =~ s/\n/
/g;
$value =~ s/\r/
/g;
# ------------------------------------------------------------
# 改行復帰文字を
に変えます。
# ------------------------------------------------------------
$value =~ s/\,/,/g;
# ------------------------------------------------------------
# 半角コンマ「,」を表示用に変えます。
# ------------------------------------------------------------
&jcode'convert(*name,'sjis');
&jcode'convert(*value,'sjis');
# ------------------------------------------------------------
# name、valueが付く変数すべて($name、@name、%nameなど)を
# sjisコードに変換します。
# ------------------------------------------------------------
&jcode'h2z_sjis(*value);
# ------------------------------------------------------------
# 半角カナを全角カナに変換します。
# ------------------------------------------------------------
$FORM{$name} = $value;
# ------------------------------------------------------------
# 連想配列%FORMに値を代入します。
# ------------------------------------------------------------
}
if ($FORM{'mail'} eq "") { $FORM{'mail'}='nodata'; }
if ($FORM{'url'} eq "") { $FORM{'url'} ='nodata'; }
if ($FORM{'url'} eq "http://"){ $FORM{'url'} ='nodata'; }
if ($FORM{'title'} eq "") { $FORM{'title'} ='無題'; }
# ------------------------------------------------------------
# メールアドレス、URL、タイトルが入力されない場合、それ
# ぞれnodata、nodata、無題を代入します。
# ------------------------------------------------------------
#=== 処理の振り分け ============================================
if ($FORM{'submit'} eq '投稿する'){
&error_check;
&store;
&disp;
} else {
&disp;
}
exit;
# ------------------------------------------------------------
# フォームの「投稿するボタン」が押されたとき、
# &error_check(入力データのチェック)、&store(書き込み)
# &disp(掲示板の表示)のサブルーチンを実行します。
# そうでないとき、
# つまりこの掲示板が始めて表示されたとき、
# &disp(掲示板の表示)のサブルーチンを実行します。
# exitはプログラムの終了です。なくても構いません。
# ------------------------------------------------------------
#
#
#
#
#******************** SUBROUTINE *******************************
#
#
#=== 入力データエラーの検出 ====================================
sub error_check {
if ($FORM{'name'} eq "") {push(@err,"名前がありません。");}
if ($FORM{'message'} eq "") {push(@err,"本文がありません。");}
if (@err>0) {&error;}
}
# ------------------------------------------------------------
# 各データが空白の場合、配列@errにエラーメッセージを代入し
# ます。
# そして、@errの要素が0でないとき、サブルーチンerrorを実行
# します。
# push(配列,データ)は、配列に後ろからデータを代入します。
# ------------------------------------------------------------
#=== 表示 ======================================================
sub disp {
print "Content-type: text/html\n\n";
print "
\n"; print "\n"; print "$bbs_title
\n"; print "\n"; print "[トップにもどる]
\n"; print "