トップへ
田村研究室

インターネット利用技術演習

2009年度

2009
6/29

入力フォームとCGIの連携

入力フォームとの連携方法

前の課題のようなフォームを使ったアンケートページは,通常はCGIを利用して入力されたデータを自動処理する.具体的にいえば,自動的に集計作業を行い,結果を表示させる.

入力フォームを使用したページからのCGIスクリプトの呼出方法

<form METHOD="POST" ACTION="http://どこかのサーバ/なんとか.cgi">

上記の入力フォームは,データが入力されてsubmitボタンを押されると,cgiスクリプト「なんとか.cgi」が「どこかのサーバ」上でプログラムととして実行されることを示している.

このとき,そのCGIスクリプトへ入力フォームにユーザが入力したデータ内容が受けわたされる.

<form METHOD="GET" ACTION="http://どこかのサーバ/なんとか.cgi">
も同様だが,GETメソッドを指定した場合とPOSTメソッドを指定した場合には,入力データの受け渡し方法に違いがある.

CGIスクリプト側でのデータの受け取り方

CGIスクリプトに受け渡されるデータは,POSTメソッドの場合には「標準入力」として渡される.GETメソッドの場合には「環境変数」として渡される.

標準入力とは,通常はキーボードから入力されたデータのことである.CGIスクリプトの場合には,フォームに書き込まれたデータをあたかもキーボードから入力されたものであるかのように受け取れることを示している.

POSTメソッドによって標準入力から渡されるデータを読み込むには,プログラム中に次のように書く.

read param

これにより,受け取ったデータを変数「param」に格納する.※paramではなく好きな変数名でもよい.

GETメソッドの場合には

param=$QUERY_STRING

GETメソッドではデータが環境変数「QUERY_STRING」に格納されて渡されてくることになっている.それを変数paramに代入することで受取をおこなえる.※「QUERY_STRING」という名前は変更できないが,「param」の方は変更できる.

(環境変数や標準入力についてはシェルスクリプトを参 照.)

入力されたデータがCGIスクリプトに受け渡される形式

受け取ったデータは,POSTメソッドGETメソッド両方ともに,項目名=値&次の項目名=値のような形式である.

例えば,先の例に示した変数paramには,次のような中身が代入される.

  sex=1&birth=12&select=3
「項目名=値」の形

ここで現れる項目名は,入力フォームの側の「<form name=」として設定したものである.また,その値としては入力フォームで「value=」で指定したも のが入ってくる.

練習課題

前の課題で作成したアンケートページを書き換えて,CGIスクリプトを呼び出すように書き換えてみよ.呼び出すスクリプトは次のようなものとする(受け渡されたデータをそのまま表示するだけのもの).

#!/bin/sh
echo Content-type: text/plain
echo

#POSTメソッドの場合には
read param

echo "$param"

この内容を,例えばchkparam.cgiとしてCGIスクリプト用のフォルダに保存した上,CGIスクリプトとして動作するようにアクセス権を設定する.そして,アンケートページ側で,それを呼び出すようにCGIスクリプトのURLを指定する.

アンケートページの書き換えは,前の課題ではACTIONのところに"mailto:"を指定したところを,CGIを呼び出す場合には"http://どこかのサーバ/なんとか.cgi"に書き換えること.さらに,前の課題では必要であった"ENCTYPE="の部分は削除するこ とを忘れないように.それはあくまでmailtoのための設定で,CGIの場合に指定するとうまく動作しなくなる.

そのうえで動作確認してみよ.項目名=値&項目名=値のような形式で,例えば次のようにアンケートに存在するすべての項目が表示されれば成功である.

 sex=1&birth=12&select=3

これら項目名と値に日本語が指定されていると,URLエンコードされた状態で表現されるため,一見文字化けしたように見える.URLエンコー ドについては後述する.そのためCGIで処理する場合,項目名と値には日本語は使わず,英数字と記号だけを使用するように,入力フォームの記述を変更した方がよい.