CGIへデータがGETで渡されてもPOSTで渡されても、どちらでも対応できるように書いておくと、GET・POSTどちらでも使えるCGIになって便利です。
にしし ふぁくとりー

にししの Perl/CGI Tips ふぁくとりー

にししふぁくとりーPerl/CGI Tips → このページ

Perlスクリプト全般TIPS

GETでもPOSTでもどちらでもパラメータを受け取れるようにする

CGIへデータがGETで渡されてもPOSTで渡されても、どちらでも対応できるように書いておくと、GET・POSTどちらでも使えるCGIになって便利です。 GETかPOSTかは、環境変数の REQUEST_METHOD を調べればすぐに分かります。

SOURCE 1

環境変数 REQUEST_METHOD で、GETかPOSTかを調べられます。 GETなら環境変数 QUERY_STRING から、POSTなら標準入力から環境変数 CONTENT_LENGTH サイズ分だけ情報を取得します。 また、POSTでも、QUERY_STRING がある場合があるので、POSTなら両方から情報を取得します。
$buffer = "";
if ($ENV{'REQUEST_METHOD'} eq "POST") {
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}
$querybuffer = $ENV{'QUERY_STRING'} . '&' . $buffer;
これで、GET・POSTどちらの場合でも、変数 $querybuffer 内にパラメータ(CGIへ渡されるデータ)が格納されることになります。 プログラム内では、この変数 $querybuffer の中身を split などで分割して使えば良いわけです。

SOURCE 2

ちなみに、上記の変数 $querybuffer 内の文字列を分割して使うには、次のようなコードを書けばよいでしょう。
my @pairs = split(/&/,$querybuffer);
foreach $pair (@pairs) {
   my ($name, $value) = split(/=/, $pair);
   # 分解
   if( $name eq "name" ) {
      $username = $value; # 名前
   }
   elsif( $name eq "email" ) {
      $useremail = $value; # メールアドレス
   }
}
上記では、変数 $querybuffer 内の文字列を split関数を用いて「&」記号で分割しています。 その「&」で分離された文字列を、さらに、split関数で「=」記号で分割しています。 これによって、「sample.cgi?name=Nishishi,email=hoge@nishishi.com,…」のような文字列を項目ごとに分割できるわけです。

SAMPLE SOURCE

ソースコード12 , 出力結果12
2004/02/29. Sun.

このページに記載の内容は、必ずしも正しいとは限りません。ご注意下さい。
製作者にししへのご連絡は、メールなどでお送り下さい。
どのページへもリンクは歓迎します。