百人一首クイズ2
百人一首クイズ2
今回は選択された回答に対し正解の是非を処理させる。
外部ファイル読込み~リダイレクト
POSTデータがない場合はリダイレクトする。
require_once dirname(__FILE__).'/init.php';
session_start();
session_regenerate_id(true);
if(!isset($_POST)){
header(ROOT_URL.'index.php');
}
セッションデータを変数に格納
出題ページでDBから呼んできたデータをセッションで受け取り、それぞれ変数に格納する。
$get_anser=$_GET; $monme=$_SESSION['monme']; $code=$_SESSION['seikai']['code']; $kami=$_SESSION['seikai']['kami']; $shimo=$_SESSION['seikai']['shimo']; $poet=$_SESSION['seikai']['poet'];
成否判定
POSTで得たformの選択結果と正解の歌番号を比較する。正解した場合はok_countを加算し、結果表示に反映させる。
if($_POST['kotae']===$_SESSION['seikai']['code']){
$hantei="正解!";
if(isset($_SESSION['seikai']['ok_count'])){
$ok_count=$_SESSION['seikai']['ok_count']+1;
}else{
$ok_count=1;
}
$_SESSION['seikai']['ok_count']=$ok_count;
}else{
$hantei="不正解!";
$ok_count=$_SESSION['seikai']['ok_count'];
}
最終結果ページへ渡すデータの格納
最終結果ページ(result.php)で表示させたいデータとして、各問題の上の句、下の句、成否結果をセッションデータに格納する。
$_SESSION['rireki']['kami'][$monme]=$kami; $_SESSION['rireki']['shimo'][$monme]=$shimo; $_SESSION['rireki']['kekka'][$monme]=$hantei;
ブラウザ表示
h2で「正解」または「不正解」を、dl内に正解の歌データを表示させている。また、現在何問正解しているかも表示させることとした。
<h1>百人一首 回答</h1> <h2><?php echo$hantei;?></h2> <dl class="grayback" id="answer"> <dt>第<?php print$monme;?>問の正解</dt> <dd>第<?php print$code;?>首 詠人: <?php print$poet;?><br><?php print$kami;?><br><?php print$shimo;?></dd> </dl> <p><a href='index.php'>次の問題へ</a></p> <p>現在、<?php echo$monme;?>問中<?php echo$ok_count;?>問正解しています</p>
感想
セッションで渡すデータを歌番号(code)だけにするか、あるいはセッションで一通りのデータを渡してしまうか、この点は一考の価値がある。codeさえ受け取れば、DBにアクセスして歌を表示させることが可能である。こうすればセッションデータが最小限で済む。一方、既に出題ページでDBからデータを得ているのだから、DBへのアクセス回数を増やす必要はないのでは、という観点もある。
DBへのアクセスは何らかの制限がある。また、DBの破損やHDDの損傷リスクを考えると少しでもDBへのアクセス回数を減らすほうがよいのではないか、という発想で、今回のコード内容となった。データ内容にもよるが、セッションデータ受け渡しのほうがリスクが高いと判断されればcodeだけのやり取りのほうが良い場合もある。その点を考慮しなくてよいのであれば、コーディングを短く出来るほう、あるいは処理が早いほうに軍配が上がるであろう。
状況に応じた適切なコードが記述できるようなスキル習得を進めたい。