[ホーム] -> [ASP 実験室]

アンケートをとってテキストファイルに保存しよう

送信フォームとファイル

この章では、送信フォームを使ってクライアントからデータの入力を促す方法と、ASP を使ってサーバ側のファイル(今回はテキストファイル)を扱う方法を説明していきたいと思います。送信フォームの使い方は、何種類かありますが、入力されたデータを E-mail で特定のアドレスへ送信する方法と、サーバ側のファイルやデータベースに保存しておく方法があります。今回、ここではサーバ側のファイルにデータを保存する方法を説明します。E-mail で送る方法は、ASP を使う必要性がかなり下がってしまうので、そうしたい方はご自分で調べて下さい。

送信フォーム

さて、html 言語レベルでの送信フォームの作り方は、みなさん知っているでしょうか? このページの後の方でサンプルフォームがあるので、このページのソースを表示してみれば分かると思いますが、簡単に説明します。まず、送信するためのデータは、FORM タグで囲む必要があります。

<form method="POST" action="cgi-bin/response.asp" name="SampleForm">
    <input type="text" name="txtName" size="40" maxlength="40">
    <br>
    <input type="submit" value="送信" name="btnSubit">
    <input type="reset" value="リセット" name="btnReset">
</form>

そして、FORM タグ内には、INPUT type="submit" として、送信ボタンを付ける必要があります。入力され項目は、この送信ボタンを押されることによって、submit がある FORM タグ内のすべての入力項目をサーバ側に送信するのです。また、reset は FORM タグ内のすべての入力項目をクリアーして初期状態に戻します。入力項目の部分は、INPUT タグの type="???" の値によって、テキストボックスや、リストボックス、チェックボックス等に変化します。

さて、submit ボタンを押されたときの動きですが、FORM タグで指定されている ACTION の値である cgi-bin/response.asp というASP ファイルが実行されます。この例の場合は、相対パスで指定されていますが、もちろん絶対パスでも構いませんし、他のサーバでも構いません。そして例えば、このテキストボックスに、「送信テストだよ」という文字を入力して送信ボタンを押した場合、response.asp には、txtName="送信テストだよ" と言う感じで送られてきます。txtName とは、もちろん入力するテキストボックスの NAME に指定されている値です。

ここの例では、送信の方法を、POST としてありますが、実はこれ以外にも方法があります。ただし、大抵の場合は POST を使った方がいいと思います。特に、パスワードを入力する様なフォームの場合は、POST でないと問題があります。何故かは試してみれば分かります。

ASP で POST されたデータの処理

今度は、サーバ側でどのように送信されたデータを処理するかを説明していきたいと思います。フォームで送られてきたデータに対して、何か処理を行うのは、非常に簡単です。たとえば、次のような HTML の入力項目があったとしましょう。

<input type="text" name="txtName" size="40" maxlength="40">

なんと、この一行で終わりです。これで、txtName と名前を付けられていた入力項目の値は、SenderName と言う名の変数に入れられるのです。例え、どんなに入力項目が沢山あっても、このように処理するだけで良いのです。後は、この取りだしたデータを、ファイルに保存するだけです。

SenderName = Request.Form("txtName")

なんと、この一行で終わりです。これで、txtName と名前を付けられていた入力項目の値は、SenderName と言う名の変数に入れられるのです。例え、どんなに入力項目が沢山あっても、このように処理するだけで良いのです。後は、この取りだしたデータを、ファイルに保存するだけです。

ASP でファイルにアクセス

実は、この「ファイルにアクセス」にすごい苦労しました。まあ、分かってしまえば何てこと無いのですが・・・。

Set FileObject = Server.CreateObject("Scripting.FileSystemObject")
Set OutStream = FileObject.OpenTextFile ("C:\TEMP\DATA.TXT", 8, True, 0)
OutStream.WriteLine SenderName
OutStream.Close

流れから説明すると、ファイルを扱うためのオブジェクトを作成し、OpenTextFile メソッドでファイルを開き、WriteLineメソッドで1行ずつデータを追加し、最後に、Close と言った感じです。最初に CreateObject をしなければいけないのを除けば、VB と対して変わらないと思います。オブジェクトが何かよく分からない方は、最初の一行は、ファイルを扱うためのおまじないだとでも思っていて下さい。

今回のようなデータは、プログラミングで言う、アペンドモード(追加書き込み)で処理をしなければいけないのですが、このやり方が分からなくて苦労しました。ヘルプには、定数を使った例が載っているのですが、実はこの定数というのは、あるファイルをインクルードしなければ使えないのです。そのファイルというのは、ASP のサンプルが入っているフォルダに adovbs.inc と言う名でありますので探してみて下さい。で、このファイルをインクルードしない場合は、数値を直接指定します。OpenTextFile メソッドの2番目の引数に8が指定されていますが、これがアペンドモードの指定です。

最後に忘れずにやらなければいけないのは、書き込みファイルのパーミッションの設定です。WWW サーバを WindowsNT で運営していて、ファイルシステムを NTFS にしている場合に問題となってきます。WWW から認証をしないでアクセスした場合、ASP は IUSR_* の権限で実行されます。IUSR_* は、IIS 等をインストールした際に出来る特殊なユーザで、「IUSR_マシン名」となっているようです。ユーザマネージャ等で確認して下さい。当然ながら、デフォルトでは IUSR_*はサーバのディスクファイル(上の例では「C:\TEMP\DATA.TXT」に書き込む権限が無い場合があります。従って、最初にこの名前の空のファイルを作っておき、IUSR_* に対して書き込み権限を付けておいて下さい。ちなみに、FrontPage での書き込み権限の付け方は分かりませんでした。従って私は、直接サーバ上でパーミッションの変更を行いました。また、WWWクライアントが、直接このファイルを見ると困るので、読み取り権限を外しておくと良いでしょう。書き込みさえ出来れば、読み取りのパーミッションは必要ありません。なお、「インターネット サービスマネージャ」にも、ファイルに対して「書き込み」のアクセス権を与えることは出来ますが、これは、別の設定項目なので、今回の設定とは関係有りません。

もし、実行してみて、サーバから何の反応も起きなかった場合、サーバのインスタンスが待機状態になって、終了しないインスタンスが残ってしまいます。そうすると、実行した ASP ファイルが削除できなくなってしまいます。この場合、WWW サービスを一度停止すれば、元に戻ります。このエラーの原因は、パーミッションがおかしいか、あるいはファイルへのパスがおかしいかです。確認してみて下さい。

アンケート用サンプルの例

とりあえず、よくあるような(?)アンケートフォームのサンプルです。入力されたデータを CSV 形式でファイルに出力しています。また、On Error ステートメントを使って、エラー処理も行っています。

ここで、入力していただいた意見を元に、このページを含めて他のページも良くしていきたいと思いますので、気軽にお答え下さい。必須入力は、氏名だけですので、答えたくない項目には入れる必要はありません。もちろん、氏名も本名ではなくても構いません。必要な項目を入れたら、最後に「送信」ボタンを押して下さい。