next up previous index
Next: 16.3 ISINDEXの解析 Up: 16. フォーム Previous: 16.1 フォーム環境

16.2 入力されたデータの解析

前述したように、フォームに入力された情報は、formタグのactionアトリビュートで指定したURIに送られます。URIにmailto形式を使うことでメールを特定のアドレスに送ることもありますが、CGIプログラムのURIを指定して適切な処理を行うのが普通です。CGIプログラムで標準出力に出力したコンテンツがブラウザに送られます。

CGIを経由してデータを送る際には、一部の文字はURIの仕様に従ってエンコーディングされます。

日本語の文字コードには、EUC-JP、JIS、ShiftJISの3種類がありますが、どの文字コードが使われるかは、ブラウザによるようです。Netscape Navigator/Communicatorではフォームの送信元のファイルの文字コードと同じものが使われます。Lynxではファイルの文字コードに関係なく、すべてEUC-JPが使われます。このため、受けたデータに日本語が入っている可能性があるなら、CGIプログラム側で特定の文字コードに変換する必要があるでしょう。

エンコードしたデータは、formタグのmethodアトリビュートの値がgetのときには、環境変数QUERY_STRINGに入ります。postのときには、標準入力に入り、環境変数CONTENT_LENGTHにその大きさがバイト単位で入ります。

CGIプログラムにはPerlが多く使われます32。Perlは、テキストの入力データを加工し出力することを得意としています。CGIプログラムの役目はまさにこれです。PerlはUNIX用の言語実行環境ですが、WindowsやMacintoshにも移植されています。Perlにはさまざまな追加モジュールが提供されていますが、CGIの処理を簡単にするものもいろいろ用意されています。本ドキュメントではCGI.pmというモジュールを使うことにします。Perlの細かな言語仕様などについてはここでは紹介しません。

次のPerlスクリプトは、フォームのページで記載したnameemailの変数の値を表示するCGIプログラムです。行番号は説明のための便宜的なものなので、実際のプログラムスクリプトには入っていません。このスクリプトはUNIX用のものですが、Windowsでも同様に動作するでしょう。UNIXの場合には、chmod a+x ファイル名を実行して、実行属性を付ける必要があります。


 1:#!/usr/bin/perl
 2:use CGI;
 3:$query = new CGI;
 4:print <<EOF
 5:Content-type:text/html
 6:
 7:<html>
 8:  <head>
 9:    <title>送信結果</title>
10:  </head>
11:  <body>
12:    <h1>送信結果</h1>
13:    <ul>
14:EOF
15:     ;
16:
17:print "      <li>" . $query->param('name')  . "</li>\n";
18:print "      <li>" . $query->param('email') . "</li>\n";
19:
20:print <<EOF
21:    </ul>
22:  </body>
23:</html>
24:EOF
25:     ;

CGI.pmは、エンコーディングされたデータを復元するため、処理する際にエンコードを気にする必要はありません。ちなみに次のようなPerlスクリプトでも復元することが可能です。


s/\+/ /g;
s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg;

変数の値に日本語文字コードが含まれるときには、文字コードをCGIプログラムで扱いやすいものに統一する必要があるでしょう。UNIXであればEUC-JP、WindowsであればShiftJISに統一することになるでしょう。Perlでは、jcode.plというライブラリファイルがよく使われているようです。

Webサーバーによっては、CGIプログラムは特定のディレクトリ下にあるときのみ使用可能になっていることがあります。

CGIプログラムに渡される環境変数の代表的なものとして、次のようなものがあります。Webサーバーの種類や設定によってほかにも渡されることがあります。

AUTH_TYPE
ユーザー認証機能のプロトコル名が入ります。
CONTENT_LENGTH
フォームの形式がpostのときに入力データのバイト数が入ります。
CONTENT_TYPE
データのMIMEタイプが入ります。通常、application/x-www-form-urlencodedです。
DOCUMENT_ROOT
仮想パスのルートディレクトリに当たるローカルパスが入ります(たとえば/usr/local/etc/httpd/htdocs/)。
GATEWAY_INTERFACE
CGI/1.1などのCGIのバージョンを示します。
HTTP_ACCEPT
ブラウザが受け付けることができるMIMEタイプのリストが入ります。
HTTP_ACCEPT_CHARSET
ブラウザが受け付け可能な言語セットのリストが入ります。
HTTP_ACCEPT_LANGUAGE
ブラウザが表現できる言語コードのリストが入ります。
HTTP_CONNECTION
httpの接続方式を示します。
HTTP_HOST
Webサーバーの完全修飾ドメイン名またはIPアドレスが入ります。
HTTP_PRAGMA
キャッシュの制御を行います。no-cacheが値の場合、キャッシュを行いません。
HTTP_REFERER
CGIプログラムを実行したURIが入ります。
HTTP_USER_AGENT
ブラウザの名前やバージョンなどの情報が入ります。
QUERY_STRING
フォームの形式がgetのときに入力データが入ります。
REMOTE_ADDR
ブラウザを実行しているホストのIPアドレスが入ります。
REMOTE_HOST
ブラウザを実行しているホストの完全修飾ドメイン名が入ります。
REQUEST_METHOD
フォームの形式(GETまたはPOST)が入ります。
SCRIPT_FILENAME
CGIプログラムのローカルパス名が入ります(たとえば/usr/local/etc/httpd/cgi-bin/test.cgi)。
SCRIPT_NAME
CGIプログラムの仮想パス名が入ります(たとえば/cgi-bin/test.cgi)。
SERVER_ADMIN
Webサーバーの管理者の連絡先が入ります。
SERVER_NAME
Webサーバーの完全修飾ドメイン名またはIPアドレスが入ります。
SERVER_PORT
Webサーバーの接続ポート番号が入ります。
SERVER_PROTOCOL
httpプロトコルのバージョンが入ります(たとえばHTTP/1.0)。
SERVER_SOFTWARE
Webサーバーソフトウェアの名前やバージョンが入ります。



Kenshi Muto
平成11年9月19日