前回ラジオボタンの例を説明しましたが、
CGIの処理は例外を除いて他の場合でも同じです。
つまり、ページでラジオボタン、セレクトメニュー、テキストボックスのどれになっていても、
CGIへは「NAME=VALUE&NAME=VALUE&・・・」というふうに、
「NAME」と「VALUE」だけが送られるのです。
したがって、CGIでは「NAME」と「VALUE」の組み合わせだけで判断することになります。
言いかえれば、ページでラジオボタンだったのを、セレクトメニューやテキストボックスに置き換えても、
CGIプログラムは変える必要はありません。
(実際は、テキストボックスの場合は入ってくるデータが予測できないので、注意が必要です)
はじめに「例外を除いて」を書きましたが、その例外とは、チェックボックス、画像ボタン、 そしてファイルを直接送る場合です。ファイルを送る場合については説明しません。
画像ボタン(INPUT TYPE=image)
の場合は、その画像のどの点がクリックされたのかが、
X座標、Y座標の数値のペアとして送られます。具体的には、
< INPUT TYPE=image SRC="button.gif" NAME="BUTTON" >
というボタンに対して、例えば、
BUTTON.x=6&BUTTON.y=15
というデータが送られます。
チェックボックスでは、ひとつの項目について、複数のデータを送ることができます。
プログラムの立場で言えば「NAME=VALUE」という形式はそのままですが、
「Check=1&Check=3& ・・・」というように、
ひとつの「NAME」に対して、「VALUE」が複数になることもあります。
1個や0個の場合もあります。
(ラジオボタンとかでは、ひとつの「NAME」に対して、
ただ一つの「VALUE」だけが必ずきます)
そこで、プログラムでは、「チェックボックスからの値に対しては複数の値をまとめる」という処理が必要になります。
簡単な方法としては、チェックボックスからのデータなら配列に入れて、その他からのデータなら普通の変数に入れる、
ということになるでしょう。この区別は「NAME」を見ることによってできます。
例えば、次のようになります。
1: $InData = $ENV{'QUERY_STRING'};
2:
3: @InForms = split /&/, $InData;
4:
5: foreach $InForm(@InForms)
6: {
7: ($Name, $Value) = split /=/, $InForm;
8: if($Name eq "Check"){push @InCheck, $Value}
9: else{$In{$Name} = $Value}
10: }
ここでは、3行目の「@InForms」が、NAME=VALUE という形の要素からなる配列です。
その各要素を切り分けるのが5から10行目までですが、
8行目で、もし NAME が Check ならば
(この Check というのは、自分でフォームのHTMLに書いているNAMEで、
チェックボックスなら自動的に Check になるということではありません)、
その値 VALUE は、@InCheck という配列に追加されます。
それ以外のものは、9行目で %Inという連想配列(ハッシュ)に入ります。
これでひとまずデータ取得の方法はできました。