第三章:フォームの利用(1)
ここでは、フォームからのデータをCGIで取得する方法と、その仕組みを簡単に説明します。フォームの種類、使い方などはHTMLのマニュアルを参照してください。まず、GET方式でデータの送受信方法です。GET方式でデータを送信するためには、FORMタグにMETHOD="GET"と記述します。GET方式でデータを送信すると、フォームデータがエンコードされ、URLの一部としてACTIONで指定された「foo.cgi?」の後に特定のフォーマットで続けられます。よって、第二章で例に出したQUERY_STRINGを取得すれば、GET方式のフォームデータは受け取れることになります。例えば、
<FORM METHOD="GET" ACTION="http://www.abc.com/cgi-bin/foo.cgi">
<INPUT TYPE="TEXT" NAME="handle" VALUE="Myu">
<INPUT TYPE="TEXT" NAME="link" VALUE="OK">
<INPUT TYPE="SUBMIT" VALUE="Submit">
</FORM>
このようなフォームでsubmitボタンが押されたとすると、どのようなURLになるのでしょうか。
http://www.abc.com/cgi-bin/foo.cgi?handle=Myu&link=OK
このようになります。ただし、'?'以降の'&'と'='以外はエンコードされています。ここではわかりやすいように、元の文字で示しました。QUERY_STRINGには'?'以降の
handle=Myu&link=OK
だけが格納されます。
では、QUERY_STRINGに格納されたデータを実際に利用するにはどのようにしたらよいのでしょうか。
・QUERY_STRINGの一番はじめに出てくる'&'を探し、その前後で文字列B,Aに分割
・文字列Bをデコード
・文字列Bの先頭から一番はじめに出てくる'='を探し、その前後で文字列C,Bに分割
このような作業をしなければなりません。では、具体的なソースを示します。
struct{
char name[10];
char value[500];
}query[10];
squery = getenv("QUERY_STRING");
for(i = 0; *squery && i < 10; i++){
split(query[i].value,squery, '&');
decode(query[i].value);
split(query[i].name, query[i].value, '=');
}
1〜4行目では、フォームデータののタグで指定されたNAMEと、VALUEをそのまま格納する構造体を定義しています。query[10]としてあるのは別に意味はありません。多くのフォームを使うのならば、この値をフォームの数に合わせてください。フォームの数やデータの大きさに関係なくデコード、分割する関数はCGI汎用ユーティリティーにその他の関数とともに入っていますので、ソースを見たい方はダウンロードしてください。
7〜11行目では上記の手順通りにデータを実際に利用できる形にしています。ちなみに、この場合は
query[0].name = handle
query[0].value = Myu
query[1].name = link
query[1].value = OK
と格納されます。
GET方式を用いると、CGIプログラムにパラメータを与えたりするのに非常に便利ですが、送信するデータにサイズの制限があることや、エンコードされたフォームデータがURLの一部として続けられるためにCGI実行時にブラウザーのURL欄に表示されてしまうと言う欠点があります。次の章では、大きなデータを送信するのに適している、POST方式について説明します。
□次の章へ