getとpost フォームとCGI目次 日本語の処理

入力データの取り出し方

フォーム形式のデータから入力データを取り出す方法はいろいろあります。フォーム形式で定められた name属性で指定された名前とその値の組でデータを構成したほうが取扱が楽です。そして、入力データには次のような形式を持っています。
Name1=Your+Name&Name2=Data&Name3=yes
そして、サーバ側で入力データを簡単に取り出すツールには次のようなものがあります。

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で記述した場合に用いられます。getpostにも対応しており、結果を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の古い版のライブラリも便利です。このライブラリの仕組みは、次のようになっています。 ライブラリは、次のサブルーチンを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

cgicThomas Boutellが開発した CGIプログラミングのための ANSICライブラリです。このライブラリは以下から入手可能です。

http://sunsite.unc.edu/boutell/cgic/cgic102.tar.Z
http://www.boutell.com/cgic/cgic102.tar.Z



Copyright (C) 1996-2003 by Yasukazu Yokoi. All Rights Reserved.