[Up] [Next]
[Previous]
入力データの取り出し方法
フォーム形式のデータから入力データを取り出す方法はいろいろあります。フォー
ム形式で定められた NAME属性で付けられた名前とその値の組でデー
タを構成した方が取扱いが楽です。そして、入力データには次のような形式を
持っています。
Name1=Your+Name&Name2=Data&Name3=YES
- 各名前/値の組はアンパーサンド記号(&)で区切られます。
- フォーム形式の名前/値の組はイコール記号(=)で区切られています
(名前=値)。データが無い場合、名前のみになります("name=")。
- 特殊文字(7ビットであらわせないASCII文字)は16進数で%NN
形式で表されます。特殊文字には =, &, % が含まれています。
(URLエンコード)
- 空白はプラス記号(+)に置き換えられます。
そして、サーバ側で入力データを簡単に取り出すツールには次のようなものが
あります。
- CERN httpdサーバであれば、cgiparse
- uncgi
- cgi-lib.pl
cgiparse
cgiparseプログラムはCERN httpdに含まれているユーティリティプロ
グラムです。CERN固有のものなので、他のサーバで利用するのは難しいでしょ
う。単純にCGIスクリプト内に cgiparse を実行すれば、
FORM_theNameに収められます。/bin/sh から呼ぶには、
eval '/usr/local/www/cgi-bin/cgiparse -form'
とするだけです。ここで注意するのは、CGIスクリプトからcgiparseを呼ぶ場
合、コマンドのフルパス名を記述するか、PATH変数あらかじめ指定しておく必
要があります。
uncgi
uncgiは、Steven Grimm 氏がC言語で作ったcgiparseと似た機能を持つプログ
ラムです。cgiparseよりもPOST形式の取り出しが簡単です。uncgiは
cgi-bin ディレクトリにインストールし、ACTION部でuncgiを指定します。次
のようなフォームを指定していて、
<FORM METHOD=POST ACTION="/cgi-bin/myscript.cgi">
uncgi を使用してデータを取り出す場合、実行するCGIスクリプトの前にパス
指定で置きます(ちょうど親ディレクトリのように見えます)。cgiparseのよう
に、CGIスクリプトの中に記述する必要がないので非常に便利です。
<FORM METHOD=POST ACTION="/cgi-bin/uncgi/myscript.cgi">
cgi-lib.pl
cgi-lib.plパッケージは、Steve Brenner氏が作った Perl ライブラリ
で、CGIスクリプトを Perl で記述した場合に用いられます。GETやPOSTにも対
応しており、結果を Perl の連想配列に入れ込みます。このライブラリの使用
方法はスクリプトの最初に次のコードを加え、CGI用 Perl ライブラリを呼び
出せるようにします。
require 'cgi-lib.pl'
そして、データを読み込む場合、
&ReadParse(*data);
とします。そうすると、data配列に入れられ、
$data{theName}形式で取り出すことができます。
#!/usr/bin/perl
print "Content-type: text/html\n\n";
require 'cgi-lib.pl';
&ReadParse(*data);
print <<EOD
<HEAD>
<TITLE>Results</TITLE>
</HEAD>
<BODY>
<H2>Results</H2>
EOD
print "<B>$data{'theName1'}</B> is first data.<P>";
print "</BODY>"
Perl 簡易ライブラリ
Steve Brenner氏が作った cgi-lib.pl の古い版のライブラリも便利です。こ
のライブラリの仕組みは、次のようになっています。
- まず、REQUEST_METHOD環境変数を見て、POSTなら
CONTENT_LENGTH分だけ$bufferに読み込みます。GET
の場合、QUERY_STRINGを$bufferに読み込ます。(CGI
引数の読み込み部)
- フィールド数が複数ある場合のために、$buffer を '&' で分割します。
- 分割した結果から、フィールド名と変数を分割し、スペース(+)をスペー
スに変換し、特殊文字の16進数文字を元に戻します(URLデコード)。
ライブラリは、次のサブルーチンをCGI引数を読み込むファイルのどこかに置
き、
sub read_input
{
local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST")
{
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else
{
$buffer = $ENV{'QUERY_STRING'};
}
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%(..)/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}
%FORM;
}
入力処理のときに
%form = &read_input;
とすれば、$form{'theName'}で取り出すことができます。
cgic
cgic は
Thomas Boutell氏が開発した CGI
プログラミングのための ANSI Cライブラリです。このライブラリは以下から
入手可能です。
-
http://sunsite.unc.edu/boutell/cgic/cgic102.tar.Z
-
http://www.boutell.com/cgic/cgic102.tar.Z
[Up] [Next]
[Previous]