$2 ブラウザからのデータの取得

2-4 フォームからのデータ取得 その2

前回ラジオボタンの例を説明しましたが、 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行目で、もし NAMECheck ならば
(この Check というのは、自分でフォームのHTMLに書いているNAMEで、 チェックボックスなら自動的に Check になるということではありません)、
その値 VALUE は、@InCheck という配列に追加されます。 それ以外のものは、9行目で %Inという連想配列(ハッシュ)に入ります。

これでひとまずデータ取得の方法はできました。


Next: 2-5 POST と GET

Previous: 2-3 フォームからのデータ取得 その1

Contents


Foundation of CGI Page

春風はるか haruka@harukaze.net