***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/