掲示板では、ブラウザから送信されたデータを何らかの型にしてWebサーバーで保存しなければなりません。
今回、データファイルはcsv形式(,カンマ区切り)で保存を行うことにします。
| 題名 |
投稿者の名前 |
投稿記事 |
| 25文字以内 |
15文字以内 |
1000文字以内 |
題名1,名前1,投稿記事1
題名2,名前2,投稿記事2
題名3,名前3,投稿記事3
…
HTMLから呼び出すとき、パラメータを渡すことで処理を分岐させる仕組みにします。
#! /usr/local/bin/perl
require 'jcode.pl';
##### パラメータ受け取り
if ($ENV{'REQUEST_METHOD'} eq "POST")
{read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});}
else
{$buffer = $ENV{'QUERY_STRING'};}
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($key, $value) = split(/=/, $pair);
$form{$key} = $value;
}
$mode = $form{'mode'};
##### 処理分岐
if ($mode eq "write")
{&write_rtn;}
elsif ($mode eq "del")
{&delete_rtn;}
else
{&display_rtn;}
##### スクリプト終了
exit;
- ■ jcode.plをインクルード
- 日本語文字コード変換のためにjcode.plのインクルードを行います。
- ■ パラメータ受け取り
- 送信されたパラメータを受け取り、スカラー変数にパラメータの内容を保存します。
- ■ 処理分岐
- スカラー変数に保持された情報からどの処理を行うのか決定します。
- ■ スクリプト終了
- スクリプトを終了します。
メインとなる処理はすべてサブルーチン内で行うことにします。
掲示板に投稿された記事を表示する機能を作成します。掲示板では、Webサーバーに保存されたデータファイルの読み書きで投稿記事の管理を行います。
sub display_rtn {
##### HTML開始
print "<HTML>\n";
print "<BODY>\n";
print "<HR>\n";
##### 入力用フォームを表示
print "<FORM METHOD=\"POST\" ACTION=\"abc.cgi?mode=write\">\n";
print "<INPUT TYPE=\"text\" NAME=\"subject\" SIZE=20>\n";
print "<INPUT TYPE=\"text\" NAME=\"name\" SIZE=20>\n";
print "<TEXTAREA NAME=\"message\" COLS=80 ROWS=5></TEXTAREA>\n";
print "<INPUT TYPE=\"submit\">\n";
print "</FORM>\n";
##### データファイルを読み込んで配列にセット
open(FILE, "message.dat") || die "bussy!!";
@lists = <FILE>;
close FILE;
##### メッセージ表示処理
foreach $list (@lists) {
@msg = split(/,/, $list);
print "題名:$msg[0]<BR>";
print "名前:$msg[1]<BR>";
print "内容:$msg[2]<BR>";
print "<HR>";
}
##### HTML終了
print "<HR>\n";
print "</BODY>\n";
print "</HTML>\n";
}
- ■ 入力用フォームを表示
- 新規に投稿するための入力フォームをHTMLで記述します。METHOD="POST"は、CGIの標準入力を使用してデータ転送を行います。転送先Webサーバーで自分自身(abc.cgi)をWriteモードで呼び出します。
- ■ データファイルを読み込んで配列にセット
- メッセージデータが書き込まれているファイルをオープンして、配列にセットします。上記の記述でファイル内のすべてのデータが配列にセットされます。
- ■ メッセージ表示処理
- 配列内のすべてのデータをHTMLに出力します。split関数は、csv形式で保存されているデータを個々のデータに分解します。
sub write_rtn {
##### POSTデータ取得
local($name) = $form{'name'};
local($subject) = $form{'subject'};
local($message) = $form{'message'};
##### 日本語コンバート
&jcode'convert(*name, "sjis");
&jcode'convert(*subject, "sjis");
&jcode'convert(*message, "sjis");
##### HTMLタグは禁止
$name =~ s/&/&amp;/g;
$name =~ s/</&lt;/g;
$name =~ s/>/&gt;/g;
$name =~ s/,/./g;
$subject =~ s/&/&amp;/g;
$subject =~ s/</&lt;/g;
$subject =~ s/>/&gt;/g;
$subject =~ s/,/./g;
$message =~ s/&/&amp;/g;
$message =~ s/</&lt;/g;
$message =~ s/>/&gt;/g;
$message =~ s/,/./g;
##### 改行コードの変換処理
$message =~ s/\r//g;
$message =~ s/\n/<BR>/g;
# メッセージファイル書き込み
local($buf) = sprintf("%s,%s,%s\n", $subject, $name, $message);
open (FILE, ">> message.dat") || die "bussy!!";
print FILE $buf;
close(FILE);
}