考え、感じる、Web制作。

Web制作の学習や情報についての記事が中心です。

百人一首クイズ2

百人一首クイズ2

今回は選択された回答に対し正解の是非を処理させる。
f:id:ys_nim_9:20141116044258p:plain

外部ファイル読込み~リダイレクト

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だけのやり取りのほうが良い場合もある。その点を考慮しなくてよいのであれば、コーディングを短く出来るほう、あるいは処理が早いほうに軍配が上がるであろう。

状況に応じた適切なコードが記述できるようなスキル習得を進めたい。