Study of CGI

フォーム

インターネットでホームページを閲覧したことのある人なら、ほとんどの方がフォームを利用したことがあると思います。

CGIプログラミングを行ったことのある方なら、一度や二度はフォームを使ったプログラミングをお粉たことがあると思います。

ここでは、このフォームをはじめとした、CGIプログラムに変数を渡す方法を見てみたいと思います。


POST/GET

クライアントから、CGIプログラムに変数を渡す方法には大きく分けて2つあります。

ひとつはフォームからサブミットボタンをクリックして送信する方法、次にリンクやブラウザのURLを利用する方法。

前者のサーバへの要求方法をPOST、後者をGETといいます。

環境変数のこうで述べたように、POSTで送られた変数は、標準入力のSTDINから読み取れ、GETで送られた変数は環境変数の$ENV{'QUERY_STRING'}にアクセスすることで所得することができます。


変数の取り込み

フォームなどから変数を取り出す方法として、次のような方法が考えられます。

必要に応じて使い分けてください。

  1. 組み込みのモジュールを使う(CGIモジュール 5.004以降)
  2. 専用のライブラリを入手して使用する(cgi-lib.plなど)
  3. 専用の関数を自作する

CGIモジュール

CGIモジュールはperlのバージョン5.004以降で標準で組み込まれているモジュールです。

このモジュールを使うときは先頭に「use CGI」と書き込みます。

これで、使用準備は完了です。CGIモジュールは、従来型の関数をエクスポートするモジュールとしても、オブジェクトモジュールとしても、使用できます。

ここでは、簡単にモジュール内の関数だけを使ってみることにします。

この、モジュールを使いフォームの値を取りすときには、param関数を使います。

単純に引数を与えずにparam関数を呼び出すと、フォーム部品のname属性を配列にして返します。

引数を渡して、呼び出すと引数で渡された名前のフォーム部品の値を返します。

$name = &param('name');

CGIモジュールでは、ほかにも標準的なHTMLを出力する方法や、フォームを生成する機能が用意されていますが、おそらくホームページ(HTML)から、入った人間はいらいらさせられるでしょう。

ただ、CGIモジュールをオブジェクトモジュールとして扱い、フォームを作成した場合、そのセッションが終わるまで(ブラウザが閉じられるまで)前回入力した値を保持しくれます。

また、CGIモジュールを使うことでアップロードやセッション管理が簡単に行えるそうです。(バージョンにもよるようです。これにかにしてはいずれ。)

ライブラリ(cgi-lib.pl)

cgi-lib.plは有名なCGIライブラリのひとつです。ここで使うのはPOST/GETのデータを解析するReadParseのみですが、ほかにもさまざまな便利な機能を提供してくれています。

(cgi-lib.plライブラリ 入手先: http://www.bio.cam.ac.uk/web/form.html

引数を渡さずに、ReadParseを呼び出すと、POST/GETのデータを%inという連想配列にして作成します。次のように引数を渡した場合には、引数を名前とした連想配列を作成します。

$name = &ReadParse('form_names');

自作関数

STDINと$ENV{'QUERY_STRING'}を読んで%inという連想配列にして出力してくれる専用の自作の関数を作成してみます。

しかし、これはあまりお勧めできる方法ではありません。使用の際にはできる限りの検証を行って間違いが無いようにしてください。

とはいえ、特に読み込み時に何らかの処理をしたい場合など、必要な場合もあると思います。

sub decode_fun { 

	local($key, $val, $buffer);

	#投稿サイズを制限するとき
	$maxpost = 15000;#投稿サイズ

	if ($ENV{'REQUEST_METHOD'} eq "POST") {
		if ($ENV{'CONTENT_LENGTH'} > $maxpost) {
			#投稿サイズを制限するときの処理など 
		}
		read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
	} else {
		$buffer = $ENV{'QUERY_STRING'};
	} 

	%in=();#フォーム部品連想配列

	#$bufferを&で切って配列に
	@parts = split(/&/,$buffer);

	#配列になったフォームデータをループで処理
	foreach $pair (@parts) { 
		($key, $value) = split(/=/, $pair );

		#URLエンコード
		$key =~ tr/+/ /;
		$key =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
		$value =~ tr/+/ /;
		$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

		# 日本語を使っているときは文字コード変換
		# 必要ならタグ排除処理
		# 必要なら特殊文字排除処理
		# その他の処理

		#フォーム部品追加
		$in{$key} .= "\0" if (defined($in{$key}));
		$in{$key} .= $value;
	} 
} 

ポイント

  1. POSTで送られた変数は標準入力(STDIN)、GETで送られた変数は環境変数の$ENV{'QUERY_STRING'}~から読み出します。
  2. フォームやURLから変数を取り出すには、CGIモジュールやcgi-lib.plなどのCGIライブラリを利用できます。
  3. 自作の関数を使用の際にはできる限りの検証を行ってください。
Environment HomePage Mail

□新着

  • 2016/04/14
    ページ復旧
  • 2007/10/06
    Story Maker始動
  • 2007/06/13
    久々の更新
  • 2007/01/06
    logちょっとバージョンアップ
  • 2006/07/27
    ホームページのPerl 終了

□Topics

  • 2016/04/14
    サイト復旧
  • 2007/10/06
    StoryMaker始動
  • 2007/06/13
    今後にぜひご期待を!
  • 2006/06/26
    今後について
  • 2006/06/15
    環境の変化