まずは、左の図のようなページを作ります。
<HTML> <HEAD> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <TITLE>test</TITLE> </HEAD> <BODY> <FORM METHOD="POST" ACTION="cgi02.cgi"> 氏名:<INPUT TYPE="TEXT" SIZE="40" NAME="namae"><P> 住所:<INPUT TYPE="TEXT" SIZE="40" NAME="jusho"><P> 性別:<INPUT TYPE="radio" NAME="SEX" VALUE="MALE">男 <INPUT TYPE="radio" NAME="SEX" VALUE="FEMALE">女<P> 性格:<INPUT TYPE="checkbox" NAME="ONWA">穏和 <INPUT TYPE="checkbox" NAME="INKEN">陰険<P> <INPUT TYPE="SUBMIT" VALUE="送信"> </FORM> </BODY> </HTML>
フォームの要素の名前はそれぞれ、namae, jusho, SEX, ONWA, INKENとなっています。
入力欄には今のところ半角英数字のみしか入力しないものとします。また、 ユーザー入力欄はSIZE="40"としてあるので最大でも40+40で80バイトしか入力できない ものとします。さらに、入力欄にはタグの類とか変な記号は入力しないものとします。 また、入力欄でEnterキーを押すと「送信」ボタンを押したとみなされるものとします。
では、これで、送信ボタンを押して実験してみます。
フォームの要素の名前=ユーザー入力&フォームの要素の名前=ユーザー入力&...
というような感じでデータが送られています。また、スペースは「+」に置き換えられていますね。 ラジオボタンはチェックされているもののVALUEが送信されています。チェックボタンは 「チェックのついているものの要素の名前=on」という形で送信されています。
さて、プログラム上では標準入力から読み込めばよいことになります。
いろいろな方法が考えられると思いますが、今回はもっとも簡単な方法をとります。
// cgi02.c #include <stdio.h> int main() { char szBuf[256]; int i; char c; for (i = 0; (i < 255) && (c = getchar()) != EOF; i++) { szBuf[i] = c; } szBuf[i] = '\0'; printf("Content-type:text/html\n\n"); printf("<HTML>\n"); printf("<HEAD>\n"); printf("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\">\n"); printf("<TITLE>cgi02</TITLE>\n"); printf("</HEAD>\n"); printf("<BODY BGCOLOR=\"#FFFF00\">\n"); printf(szBuf); printf("</BODY>\n"); printf("</HTML>\n"); return 0; }さて、標準入力から読み込んだ文字列には終端にヌル文字がついていないので、自前で 付けています。
最初に文字配列を用意していますが、通常はこのような方法はとりません。 ブラウザから送られてくるデータの長さは環境変数から取得することができるので これで動的にメモリを確保して利用します。意図的に大量のデータが送られてくることが あるので、データ量がある値以上の時は、エラー表示を出してそれ以上処理を 進めないといった工夫も必要になります。
さて次に、受け取ったデータを自分のHTML中で使えるように加工することが必要となります。 いろいろ考えてみてください。
Update Jul/27/2002 By Y.Kumei