Dreamweaver TechniqueJAVA Script サンプル | CSS sample | JAVA Applet sample | Flash Sample
HTML4.0 riference | DynamicHTMLXHTML | XML sample | XSLT sample | RIKO's ASP Trial

受信データをファイルに保存する処理を設定する

ユーザーから送信されたデータの変換が終了したら、データの保存用のファイルに書きこむ処理を行います。ここでは、文字列の変換が終了したデータをデータ保存用のファイルに書きこむ処理について考えてみましょう。

■ 必須の入力項目のチェック

エディタで「libraly.pl」を開き、名前とコメント欄に入力されているかチェックを行うための処理を記述します。

sub do_write {
# 入力内容のチェック
if ($name eq "") {
&error("お名前を入力してください");
}
if ($comment eq ""){
&error("コメントを入力してください");
}

■ ファイルに保存済みデータを取得する定義

書き込みの時間とホスト名を取得し、ファイルに保存済みのデータを取得するための処理を記述します。

f# 書き込みを行った時間を調べる
&get_time;

# ホスト名を取得
$host = $ENV{'REMOTE_HOST'};
$addr = $ENV{'REMOTE_ADDR'};
if ($host eq '') {$host = $addr;}

# ファイルに保存済みのデータを読み込む
open(DATA,"<$datafile");
@all_data = <DATA>;
close(DATA);

■ データの保存

既存のデータから最新の書き込みデータを取り出して「No」の設定を行い、最新書き込みデータを保存用ファイルに追加する処理を記述します。

# 書き込みデータのNoを設定する
($end_no,$end_date,$end_name,$bemail,$end_sub,$end_comment,$end_url,$end_host) = split(/,/, $all_data[0]);

$no = $end_no + 1;

# 指定した保存件数を超えるデータを削除する
if ($max <= @all_data) {
while ($max <= @all_data) { pop(@all_data); }
}

# 新しいデータをファイルに保存する
$newdata = "$no,$date,$name,$email,$sub,$comment,$url,$host,\n";
unshift (@all_data,$newdata);
open(OUT,"+<$datafile");
flock(OUT,2);
seek(OUT,0,0);
print OUT @all_data;
close(OUT);
}

■ 書き込みデータの「No」

例の掲示板では、書き込まれた内容を保存する場合に、投稿順に「No」をつけるようにしています。この場合、保存されているデータの中から取り出した最新の書き込みデータの「No」に「1」を加算することで、順番に「No」を付けて行くようにしています。

■ 「pop」関数

「pop」関数は、配列に含まれるデータの最後のデータを取り出すための関数です。ここでは、掲示板の書き込みデータの最大保存件数を予め50件に設定しているので、例のスクリプトでは50件を超えるデータは古い順に取り出すようにしています。このとき、取り出されたデータは、配列の中に残らないので、結果的に配列の中のデータが1つ減ることになります。
最大保存件数を変更する場合は、「keijiban.cgi」で設定した「$max」の値を変更します。

■ 「unshift」関数

「unshift」関数は、 配列の先頭に新たなデータを追加する関数です。書き込まれたデータは、文字のデコードなどの処理を経て、データを保存するファイル「data.log」に保存する必要がありますが、この場合、新しいデータは常に先頭の行に追加していく必要があります。このため、例のスクリプトでは、これまでのデータを格納した配列変数「@all_data」の先頭に新しい書き込みデータである「$newdata」を追加しています。

■ 必須入力項目

書き込みを行うフォームでは、最低でも名前の欄とコメントの欄を必須の入力項目にする必要があります。これは、名前やコメントを入力していないデータがそのまま掲示板に送信されてくるのを防ぐためで、この設定を行わないと、重要な項目が抜けた書き込みデータがそのまま掲示板に表示されてしまいます。このため、例ではこの2つの項目に入力がない場合は、エラー画面を表示して送信ができないようにしています。

<<<戻る

R HOUSE | RIKO's Trial Page | Shirley's Pettit Case | Shirley's i-box | Shirley's little box