***HPクリエイターのためのCGI講座 第37回***
2.3 パラメータの取得−1

CGIへパラメータを渡す方法は2つあります。
GETとPOSTです。
GETは環境変数に、パラメータを渡します。
POSTは標準入力へパラメータを渡します。
それぞれについて、具体的な例を用いて説明します。

<GETでパラメータを渡す>
HPのHTMLソースを覗いてください。
<FORM action="tst_para.cgi"><INPUT size="20" type="text" name="get_txt" value="GETの実験" maxlength="20"><INPUT type="submit" value="実行"></FORM>
と書かれてある行があると思います。
この行の意味は、ブラウザの表示とつき合わせてもらえれば、大体理解できると思います。

各タグの意味
<FORM action="tst_para.cgi">〜〜</FORM>
起動するCGIプログラム名を指定します。
ここで、本当はGETかPOSTのmethodを指定します。
この例では、methodの指定がありません。
methodが指定されない場合は、GETと解釈されます(デフォルト=GET)。

<INPUT size="20" type="text" name="get_txt" value="GETの実験" maxlength="20">
INPUT 入力フォームのタグ
type="text" 一行入力
size="20" 入力文字サイズ(半角で20文字分の入力エリアを表示)
name="get_txt" パラメータの名前
value="GETの実験" デフォルト値(最初に設定するデータ)
maxlength="20" 最大入力文字数(半角で最大20文字の入力が可能)

<INPUT type="submit" value="実行">
INPUT 入力フォームのタグ
type="submit" submitボタン
value="実行" ボタンに表示される名前

<POSTでパラメータを渡す>
同じく、HPのHTMLソースを覗いてください、次に示す記述がありますね。
<FORM method="POST" action="tst_para.cgi"><INPUT size="20" type="text" name="post_txt" value="POSTの実験" maxlength="20"><INPUT type="submit" value="実行"></FORM>
これが、POSTによるパラメータの渡し方です。
前述のGETの時と違いFORMタグにmethod="POST"の記述が追加されていますね。
GETとPOSTの違いはここだけです。

<パラメータを受け取る>
では、CGIプログラムがどのようにパラメータを受け取るれば良いのでしょうか?
HPをご覧ください、tst_para.cgiのプログラムコードを説明していきます。

if ($ENV{'REQUEST_METHOD'} eq "POST"){
    ここで、環境変数 $ENV{'REQUEST_METHOD'} を判定しています。
    環境変数とは、CGIプログラムの起動に先立って、システムが事前に設定する変数のことです。
    環境変数は %ENV と命名されたハッシュテーブルに格納されています。
    $ENV{'REQUEST_METHOD'}にはmethodによって、"POST"か"GET"の文字列が格納されています。

    read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
    method="POST"の場合、そのパラメータの長さが環境変数 $ENV{'CONTENT_LENGTH'} に設定されています。
    また、method="POST"の場合は、パラメータは標準入力から取得できます。
    このread文の文法は、次の通りです。
    read(ファイルハンドル, 読み込み領域, 読み込みバイト数);
    意味は、指定されたファイルハンドルから、読み込みバイト数の大きさ分、データを読み込み領域へ格納します。
    ブラウザから、POSTされたデーターは、標準入力に渡されます。
    ファイルハンドルは標準入力の場合 STDIN を指定します。
    これは、約束事として覚えてください。
    今回のプログラム例では、$bufferにパラメータを受け取ります。
}
esle{

    $buffer = $ENV{'QUERY_STRING'};
    method="GET"の場合、パラメータが環境変数 $ENV{'QUERY_STRING'} に設定されます。
    GET の場合は上記の記述で、パラメータを取り出すことができます。
}

各々の方法で取り出したパラメータ($bufferの内容)を出力すると次のようになります。
POSTの場合
post_txt=POST%82%CC%8E%C0%8C%B1
GETの場合
get_txt=GET%82%CC%8E%C0%8C%B1

不思議な結果ですね。
ブラウザが特殊なコード(この場合、日本語コード)の場合、16進数に変換(エンコード)
するためです。
特別な変換規則に、ブランクは + へ変換する規則もあります。
(HPのGETとPOSTの実験で、ブランクを入力して結果を見れば分かるでしょう)
CGIプログラムでは、この規則にしたがって、文字コードを復元(デコード)する必要が
あります。

post_txt=POST%82%CC%8E%C0%8C%B1
をデコードすると次のようになります

取得したパラメータ post_txt=POST %82%CC %8E%C0 8C%B1
文字コード種 ASCIIコード シフトJISコード シフトJISコード シフトJISコード
実際の文字 post_txt=POST


環境変数については、ここでもう少し詳しく記述しています


********************************************************************************
講師:ALK alk@arkland.co.jp
運営:アークランド(株) http://www.arkland.co.jp/