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

3-3 フォームからのデータ取得 その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」が何個あるかわからないという状況になります。
(ラジオボタンとかでは、ひとつの「NAME」に対して、 ただ一つの「VALUE」だけが必ずきます)

Rubyの CGIライブラリでは、前回の例で注意したように「data['Back']」というのは「配列」でした。 それで、仮にフォームで「Check」というNAMEのチェックボックスから複数のデータが来た場合は、 その分だけの配列になります。
つまり、「data['Check'][0]、data['Check'][1]、data['Check'][2]、・・・」ということで、 それぞれの値をとりだすことができます。

しかし、その配列の要素がいくつあるのかは、調べてみないとわかりませんし、 実際は、各項目に対する繰り返しを使うことが多いと思います。
この部分の処理は、例えば次のような感じになるでしょう。
(「Check」というNAMEのチェックボックスとします。)

  1: for item in data['Check']
  2:   print "<LI>", item
  3:   count += 1          #とか、適当な処理
  4: end

配列に対するループの基本的な書き方です。
1行目で、配列「data['Check']」の要素をひとつ取り出して、それを「item」という変数にいれます (もうちょっと正確には、配列の要素は何かわからないオブジェクトなので、 そのオブジェクトの名前を「item」とするということになります)。
2行目、3行目は、オブジェクト「item」に対する処理です。 これは、プログラムしだいで、もっと複雑なものになるでしょう。
4行目は、繰り返しブロックの終わりに書くお約束です。
ここで、「data['Check']」の要素が残っていれば、その要素が item という名前で、 同じ処理が繰り返されます。要素が無くなれば、 end の次の行に行きます。

Ruby の場合は、選択された項目が一個でも0個(選択されてない)でも、 とりあえず、これでうまく行くようです。


Next: 4-1 簡単なパズル

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

Contents


Foundation of CGI Page

春風はるか haruka@harukaze.net