Perl入門   No.22


6.3 簡単な掲示板(CGIでPerlを用いる)
 
掲示板には様々な作り方がありますが、その中でもっともわかりやすいものを示します。各自で拡張させてください。
 
注意:掲示板が動作するには、サーバ内において、htmlとcgi-binが動作するように設定されているディレクトリに置かなければなりません。詳しくはUNIXのマニュアル或いは、サーバ管理者に問い合わせてください。
また、データ保存用のファイルが生成されます。下の例ではkeiji.datというファイル名にしていますが、特にデータファイルのパス指定をしない限り、CGIプログラムと同じ場所に作られます。ディレクトリのパーミッションを666に設定してください。
 
 
書き込みボードを作る
 
./html/write.html
<! write.html >
<html>
<head>
<title>掲示板</title>
</head>
<body>
<center>
掲示板
</center>
<FORM METHOD = POST ACTION = "/cgi-bin/write.cgi">
氏名:
<input type = "text" name = "name" size="20">
メールアドレス :
<input type = "text" name = "mail" size="40">
メッセージ:
<teztaea name="message" cols="60" rows="10"></textarea>
<input type="submit" value="記入">
</FORM>
</body>
</html>
 
書き込み用CGI
 
./cgi-bin/write.cgi
#!/usr/bin/perl

#  write.cgi  from ./html/write.html

# 仮名漢字処理の場合は、以下のライブラリーを付け加える
require "cgi-lib.pl";
require "jcode.pl";

# ほとんどおまじない
&ReadParse;

$name = $in{"name"};

# 仮名漢字の場合は、必要な文字コードに変換する。ここではeucコードに変換する
&jcode'convert(*name,"euc");

# 未記入の場合のエラー処理(java script を利用してもよい)
if(name eq ""){
   print "名前を記入してください";
}

$mail = $in{"mail"};

if(mail eq ""){
   print "mail address を記入してください";
 }

$message = $in{"message"};
&jcode'convert(*message,"euc");

#文章に改行コードが含まれていると、改行タグに変換する
$message =~ s/[\r\n,\n]/<br>/g;

if(message eq ""){
   print "メッセージを記入してください";
}

# 書き込みの日時を自動的に付ける

if($name ne "" && $message ne ""){
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
@daytime = ('日','月','火','水','木','金','土');
$month = $mon + 1;
$date = "$month月$mday日(@dayname[$wday])$hour:4min:$sec";

# メッセージファイル(keiji.dat)に書き込む
open(FILE,"keiji.dat");
   pirnt FILE "\"$name\",\"$mail\",\"$date\",\"$message\"\n";
close(FILE);
 
 
書き込まれたメッセージを表示する
 
./cgi-bin/read.cgi
#!/usr/bin/perl

# read.cgi  read keiji.dat

$no=1;
open(OUT,"keiji.dat");
while(<OUT>){
if(/"(.*)","(.*),"(.*)","(.*)"/){
  $name = $1;
  $mail = $2;
  $date = $3;
  $message = $4;
 }
  print "<hr>";
  print $no;
  print "名前:$name";
  print "日時:$date<br>";
  print "メッセージ:$message";
  $no++;
  }
  close(OUT);
 
write.html と read.cgi をフレーム機能を使って両方が同時に見えるようにする
 
./html/keiji.html
<! keiji.html  >
<html>
<head>
<title>keiji.html</title>
</hrad>
<frameset rows="40%,*" border="0">
<frame src="write.html" >
<frame src="/cgi-bin/read.cgi" >
</frameset>
</html>
 
 
自分が作ったものとして以下のものが稼働しています。どのように作ったか考えてみてください。
 
http://yoshi01.kokugo.edu.yamaguchi-u.ac.jp/kokugo/keiji/keiji.html