§7 リクエストに応答

答えを判定して、正解の場合はプレゼント応募フォームのURLを返し、不正解の場合は「残念でした」ページのURLを返すCGIを作成する。

▼クイズHTMLサンプルの抜粋

<html>
<head>
<title>パンダクイズ</title>
</head>
<body bgcolor="#FFFFFF">
<h2>パンダクイズ</h2>
問題 パンダのしっぽは 黒い色をしている。<br>
<form action="hantei.cgi" method="post"> #…(1)
     <input type="radio" name="answer" value="yes">YES<br> #…(2)
     <input type="radio" name="answer" value="no">NO<br>
     <input type="submit" value="ファィナルアンサー"> #…(3)
</form>
</body>
</html>



■フォームにはアクションを! ・・・(1)

フォームのsubmit(いわゆる送信ボタン)ボタンをクリックしたら、どのCGIを実行させるのか<form>タグのactionで指定する。



■フォームのメソッド? ・・・(1)

<form>タグのmethodには、postまたはgetのどちらかを指定する。両者の違いはブラウザからWebサーバーに送られるデーターのヘッダと本体のどちらを使ってフォームデーターを送るかである。postは本体にデーターを置き、getはヘッダにデーターを置く。一般的にはpostが使われる。



■ラジオボタン ・・・(2)

ひとつを選択すると他の選択が解除されて、グループの中でいつも1つしか選択できないボタン(チェック項目)のこと。<input>タグのnameが同名であれば同じグループということになる。CGIには<input>タグのvalueに書かれた文字がデーターとして届く。



■サブミットボタン ・・・(3)

このボタンをクリックするとフォームのデーターがCGIに送られる。フォームには必ず必要なボタン。valueに文字を指定すると、ボタンに表示される。Submitとか送信ではなく分かりやすい表示にしよう。


▼判定CGIのサンプル

#!/usr/local/bin/perl
use strict;
use CGI;  #…(1)

# 正解を準備する
my @seikai = ('no','yes','no');

# CGIモジュールを誕生させる
my $query = new CGI;  #…(2)

# フォームからのデーターを取り出す
my $bangou = $query->param('bangou');  #…(3)
my $kotae = $query->param('kotae');

# 正解の場合、クッキーに保存してフォームページのURLを返す
if ($kotae eq $seikai[$bangou]) {
     my $cookie = $query->cookie(
     -name => 'panda_quiz',
     -value => 'seikai',
     -path => '/');  
     print "Set-Cookie: $cookie\n";
     print "Location: seikai.html\n\n";
}  #…(4)
# 不正解の場合、残念ページのURLを返す
else {
     print "Location: fuseikai.html\n\n";  #…(5)
}


■モジュールを使うことを宣言 ・・・(1)
use CGI;
useは命令の集合体(モジュールと呼ぶ)を使うことを宣言する命令。フォームの値を取り出したりする命令の集合体(モジュール)であるCGIモジュールを使えるようにプログラムの最初で宣言しておく。

■CGIモジュールをオブジェクトとして使う ・・・(2)
my $query = new CGI;
CGIモジュールを命令の集合体としてだけはでなく、データーと命令の両方を 兼ね備えた物(オブジェクトと呼ぶ)として使う。そのため、物(オブジェクト)を 誕生させるたるにnewという命令を使う。

■フォームの値を取り出す ・・・(3)
my $bangou = $query->param('bangou');
CGIオブジェクトが持っているフォームからのデーターを取り出すためにparam命令を使う。$queryはnewの命令で誕生させたCGIオブジェクトを表している変数。->(矢印演算子)はオブジェクトの命令や変数を使うことを表す。

■答えを判定する ・・・(4)
if ($kotae eq $seikai[$bangou]) {
・・・
}
else {
・・・
}
判定にはif(条件){・・・}else{・・・}の命令を使う。{と}で囲まれた部分をブロックと呼ぶ。if直後のブロックには、条件に合うときに処理するプログラムを書く。elseの後のブロックには条件に合わないときに処理するプログラムを書く。条件に合わないときの処理がない場合は、else以降を省略できる。

■ifの条件
eqは文字を比較する演算子で、左右の文字が等しいことを意味する。下記の表のように大なり小なりを比較する演算子がある。また、数値と文字の場合は演算子が異なるので注意すること。

意味

文字の比較
数値の比較
等しい
eq
==
等しくない
ne
!=
より小さい
lt
<
より大きい
gt
>
以下
le
<=
以上
ge
>=

■URLを返す ・・・(5)
print "Location: seikai.html\n\n";
CGIが直接ページを出力するのではなく、WebページのURLをブラウザに伝えて、ブラウザがそのURLのHTMLを表示する方法。Locationは移転先などのURLを知らせるHTTPヘッダのひとつ。URLはhttp://www.panda-panda.com/index.htmlのような完全なURLで指定するか、../index.htmlのようにCGIを設置しているディレクトリからの相対位置で指定する。

■クッキーの書式でデーターを作る ・・・(4)
my $cookie = $query->cookie(

-name => 'panda_quiz',

-value => 'seikai',

-path => '/');
書式を覚えてクッキーのデーターを1から組み立てても良いが、CGIモジュールの中にクッキーデーターを作る命令を使えば簡単に作成できる。

引き数の意味
-name クッキーの名前
-value nameに対応する値
-path Webサーバーのどのページでクッキーが有効かを表す。
-domain クッキーを受取るドメイン、省略するとクッキーを送ったドメインになる。
-expires クッキーの有効期限。省略するとブラウザを開いている間だけになる。


■クッキーをブラウザに保存 ・・・(4)
print "Set-Cookie: $cookie\n";
Webサーバーからブラウザに送るヘッダの中でクッキーを使うことを指定する。クッキーの機能があり、設定が有効になっているブラウザであれば、ブラウザの秘密の場所に保存してくれる。


パンダ君の失敗

クイズの「はい」「いいえ」どちらに答えても不正解。こりゃ完全にプログラムミス、必死に間違っている所を探したけど、・・・・。もっ、もしかして、とクイズのHTMLソースを見ると、ラジオボタンのvalueにYESと大文字で記述してた。判定のCGIの中ではyesと小文字、意味的には同じだけどperlには違うものなのだ。これからはスペルミスだけでなく大文字と小文字の違いにも気をつけなくちゃ。


戻る メニューへ 次へ