買い物かご 掲示板 メール DB 利用規定 FAQ サポートBBS


次(ファイルの読みこみ)
前(サブルーチン1)
必要なツール
最低限必要な知識
Make CGI Top
Basic

Home



ファイルの書きこみ --最低限必要な知識--


例:掲示板の仕組み

どこのサイトの掲示板スクリプトでも、初期設定には必ず「$data = 'xxx.dat';」
のように、データを保存するファイルを指定するようになっています。

掲示板は(掲示板に限らず)、ユーザーがフォームから書きこんだデータをファイルに保存して、読みこむ処理を行なっていますね。

こんなことは言われなくてもわかるでしょうけど、では、どうやって、ファイルに書き込みをするのでしょうか?


OPEN関数

掲示板など、ユーザー(来訪者)がフォームに入力したデータを、ファイルに書きこむには、OPEN関数を使います。ファイルの読み出しに付いては次回説明します。

公式は・・・

open (OUT,">$data_file") || &error('オープンエラー','指定された書込みファイルが開けません。');
print OUT "書きこむデータ";
close (OUT);

または、

open (OUT,">>$data_file") || &error('オープンエラー','指定された書込みファイルが開けません。');
print OUT "書きこむデータ";
close (OUT);

となります。

$data_fileが、書きこみデータを保存しているファイル名です。通常、初期設定で、
$data_file = 'data.dat'; 等と指定するようになっていますね。

|| &error('オープンエラー','指定された書込みファイルが開けません。')

は、設置するときに、書きこみファイルのアップロードを忘れたり、パーミッションの指定を間違えた場合に、サーバーエラーを出すことなく、終了できるようにエラーメッセージを出力させています。

||の右側は、$data_fileが何らかの原因で使えない場合の処理を記述します。

前回のサブルーチンの話を覚えている人なら、別途エラー用のサブルーチンを用意する必要があることはお分かりでしょう。エラー処理に付いては、別の頁で説明します。


2種類の書きこみ方法

ファイルの書きこみ方法は2種類。「上書き書きこみ」と「追記書きこみ」があります。掲示板では、通常追記書き込みを行ないます。どこ違うのかはおいおい説明しますね。

では、実際に作ってみましょう。


作ってみよう

用意するのは・・・

データ保存用のファイル「data.dat」
CGIスクリプト「regist.cgi」
言わずと知れた「jcode.pl」

の3つのファイルです。「data.dat」の名前はお好きなように。拡張子もお好きなように。私のスクリプトでは、cgiになっています。cgiにすると、直接指定されても開けませんので、比較的安心です。

CGIスクリプトファイル名もお好きなように。

サンプルを用意していますので、ダウンロードして開いて見ましょう。このサンプルを使って説明します。理解できたら、今度は自分で作ってみましょうね。

サンプルスクリプトは、名前、メールアドレス、 コメントの3つの内容をファイルに記録するスクリプトです。ひとつのファイルに、どんどん追記していきます。新しいデータほど下に入力されます。実際にデータを登録して動作を確認してみましょう。

「regist.cgi」をURLで指定すると入力フォームが表示されます。


サンプルregist.cgi

サンプル(sample.lzh)

初期設定(Perl Editorから貼りつけたものです)の下に、前回(サブルーチン1)説明した分岐処理が入っています。

if ( $FORM{'mode'} eq 'regist' ) { &regist; }
else { &html; }

このスクリプトでは、ひとつのCGIファイルで、入力フォーム表示のための処理と、入力したデータをファイル(data.dat)に書きこむ処理の2つの処理を行なっていますので、サブルーチンを2つ(本当はエラー処理も含めて3つなのですが、ここではエラー処理は考えていません)用意しています。

&html 書きこみフォーム表示のためのサブルーチン
&regist

書きこまれたデータを「data.dat」へ書きこむためのサブルーチン

分岐するためのキーワードは$FORM{'mode'}にあることは前回勉強しました。もし$FORM{'mode'}に入った値が「regist」なら、サブルーチン「regist」へジャンプし、そうでなければサブルーチン「html」へジャンプしなさいと指示しています。

このスクリプトを最初に表示するときは、直接CGIスクリプトを呼び出しているので、$FORM{'mode'}にはなにも値が入りません。

ということは・・・

初めて表示するときは自動的に入力フォームが表示されることになります。

次にサブルーチンを見てみましょう。

  1. 「html」サブルーチン

    ここでは、ヒアードキュメントを使って、フォームタグを書きこんでいます。ここで注意するのは・・・

    フォーム内に、

    <input type=hidden name=mode value=regist>

    が入力されていることで、「data.dat」に書きこむ処理を実行させています。

  2. 「regist」サブルーチン

    一行ずつ見ていきましょう。

    open (OUT,">>$data_file") || &error('オープンエラー','指定された書込みファイルが開けません。');


    この関数はこのまま覚えてしまいましょう。Perl Editorの「定型文」の「書きこみ処理(ロック無し)」を使うと便利ですね。

    この構文は、

    $data_fileを「追記書き込みモード」で開きなさい。 という命令です。$data_fileには、初期設定でdata.datが指定されているので、実際は、data.datが開かれます。もし、data.datが存在しないかパーミッション設定が間違っている場合は、エラーを表示させます。

    >> 追記モードで開くよう指示します。新しいデータは、指定したファイルに、次々と追記されていきます。
    >

    上書きモードになります。新しく入力されるたびに、「data.dat」が書きかえられてしまい、最新の一つのデータしか保存されないことになります。



    実際に試して見ましょう。

    「OUT」は「ファイルハンドル」と言います。説明すると長くなるので割愛します。気になる人は参考書を紐解いて見ましょう。


    print OUT "$FORM{'name'},$FORM{'email'},$FORM{'rem'}\n";

    ここでは、フォームから取得したデータを「data.dat」に書きこんでいます。
    それぞれの内容を「,カンマ」で区切って入力します。最後の「\n」で改行します。

    $FORM{'name'}で名前を、$FORM{'email'}でメールアドレスを、$FORM{'rem'}でコメントをそれぞれ書きこんでいるわけですね。

    OUTを必ず入力こと。 これを忘れると、動作しません。

    close (OUT);

    これで終わり。全てのデータが書きこまれます。 open(開いた)らclose(閉じる)のは子供の頃からいやというほど教えられたはず・・・開けたら必ず閉めましょう。

    print "Content-type: text/html\n\n";
    print "<head></head>\n";
    print "<body>\n";
    print "入力しました。data.datを開きましょう。\n";
    print "</body></html>\n";

    データを書きこんだら、メッセージを表示させます。メッセージ表示を忘れると、サーバーエラーになります。データはきちんと書きこまれるのですが、Web上で表示するデータが無いので、結果としてエラーになるのです。

    exit;

    これは、CGIスクリプトを終了させるための処理です。初心者の方は必ずいれるようにしましょう。

    Perl Editorが入れてくれるソースとhtmlタグを除いた、純粋なPerlのソースは20行程度。そんなわずかなコードでこれだけの処理ができてしまいます。

Web寺子屋 OGIPOGI E-mail:info@web-terakoya.net
Copyright© 2000-2001 OGIPOGI All Rights Reserved.