掲示板 その1 - CGI(Perl)の基本と掲示板作成
目次
掲示板 その1
いよいよ掲示板作成を行ないます。まず最初はメッセージが一行だけ入る掲示板を作ってみましょう。
前回まではフォームのHTMLとフォームの内容を処理するCGIとを別ファイルで行なっていましたが、今回からはひとつのファイルでフォームの表示とフォーム内容の処理の両方を行います。
プログラム
以下のプログラムをテキストエディタで入力してください。
#!/usr/bin/perl
# 掲示板 その1
require "cgi-lib.pl";
print "Content-type: text/html; charset=Shift_JIS\n\n";
# フォーム部分を表示する
print <<EOL;
<html>
<body>
<h2>一行掲示板</h2>
<form method="post" action="bbs1.cgi">
メッセージ:<input type="text" name="message" size="60">
<input type="submit" value="送信">
</form>
<hr>
EOL
&ReadParse(*form);
# フォームの値を取得
$message = $form{"message"};
# ログファイル読み込み
open(IN, "bbs1.txt");
@log = <IN>;
close(IN);
# メッセージが入力されているときは書き込み処理を行なう
if ($message ne "") {
# ログ先頭にメッセージを格納
unshift @log, "$message\n";
# ログファイルに書き込み
open(OUT, "> bbs1.txt");
print OUT @log;
close(OUT);
}
# ログ表示
foreach $data (@log) {
chop $data;
print "$data<br>\n";
}
print "</body>\n</html>\n";
入力が終わったら、「bbs1.cgi」という名前でサーバにアップロードし、パーミッションを755にしてください。さらに、掲示板のメッセージを保存するファイル(ログファイルと言います)が必要なので、テキストエディタにて新規ファイルを作成し、中身に何も書かずに「bbs1.txt」という名前で保存します。それをサーバにアップロードし、パーミッションを666(読み書き可能)にしてください。その後bbs1.cgiが動くかブラウザで確認してください。
プログラムの説明
<form method="post" action="bbs1.cgi">
メッセージ:<input type="text" name="message" size="60">
<input type="submit" value="送信">
</form>
メッセージを書くためのフォーム部分です。action属性をbbs1.cgi、つまり自分自身にしているので、送信ボタンが押されたときにbbs1.cgiが再度実行されることになります。
$message = $form{"message"};
フォームのメッセージが入った変数はプログラム中で何度か使用しますが、$form{"message"}という変数名では長くて書きづらいので、$messageという変数に代入し、これ以後は変数$messageの値を使うようにしています。
open(IN, "bbs1.txt");
@log = <IN>;
close(IN);
ログファイルを読み込んでいる部分です。2行目の@logは配列です。配列とは、複数の変数の集まりのことです。@logは$log[0], $log[1], $log[2]…という複数の変数を持ちます。
@log = <IN>; この命令によって$log[0]にbbs1.txtの1行目の文字列、$log[1]に2行目の文字列、$log[2]に3行目の文字列…といった感じでログファイルの全ての行が配列変数に読み込まれます。
# メッセージが入力されているときは書き込み処理を行なう
if ($message ne "") {
neとはnot equal、つまり等しくないときに条件が正しくなります。今回の場合、フォームに書かれたメッセージが空でない、つまりメッセージがあるときにif文内部の処理を行ないます。
# ログ先頭にメッセージを格納
unshift @log, "$message\n";
unshiftは、配列の先頭に値を挿入する命令です。上のログファイル読み込み処理により、$log[0],$log[1],$log[2]…にそれぞれ1行目、2行目、3行目…のメッセージ文字列が入っていますが、unshift命令によって今回フォームによって送られたメッセージ文字列が、配列先頭つまり$log[0]に入ります。それに応じて今まで$log[0],$log[1],$log[2]…に入っていた文字列はそれぞれ$log[1],$log[2],$log[3]…にずれることになります。
# ログファイルに書き込み
open(OUT, "> bbs1.txt");
print OUT @log;
close(OUT);
配列@logをbbs1.txtに書き戻しています。print命令に配列を指定すると、配列の中身が順番に全て出力されます。
# ログ表示
foreach $data (@log) {
chop $data;
print "$data<br>\n";
}
配列@logに格納されたログファイルの内容を表示している部分です。foreach文は、配列の内容をひとつずつ取り出し処理する命令です。構文は以下のようになります。
foreach 変数 (配列) {処理}
まず最初に$log[0]、つまりログファイルの1行目の値が$dataに格納され、foreach文内部の処理が行なわれます。次に$log[1]の値が$dataに格納され処理が行なわれます。次に$log[2]の値が…という感じで配列の最後に到達するまで繰り返されます。foreach文内部の処理ですが、chopは文字列の最後の1文字を削る命令です。ログファイルの全ての行の最後には改行が入っています。chopによりその改行を削除しているのです。その後、print文によってメッセージをHTMLとして出力しています。