1.前回の続き(概要)
前回の記事の続き
[【PHP+SQLite3】ping-tのコマンド問題ライクなページ1 --ボタン表示切り替えに難問が!!--]
(https://qiita.com/knowledge87sun/items/31f02bd3a08b72d0ea88)
(1)カテゴリーと問題数を選択
(2)問題をランダムに表示する。--->ここからスタート
(3)入力後、答え合わせするときは確定ボタン(linux_command_test3.phpへ遷移)を、
回答しないで戻りたいときは「戻る」ボタンを押す(linux_command_test.phpへ遷移)
(4)確定ボタンを押すと、入力値とデータベースに登録された回答をチェックし、
問題に対する結果を表示する。(あっていれば〇、間違っていれば×)
さらに全体の問題数に対する正解数も表示する。
2.hidden属性
ボタンを押したときやテキストボックスの入力値(回答:$textN(N=1,2...))以外にも、
別のページで利用したいデータがある。
今回の場合で言えば、
「問題の内容」($ar_quiz2N)だったり、「総問題数」($tcnt)がそれにあたる。
そんな時に、テキストボックスやボタン名などの前に
<input type="hidden" name="btn2" value="=$tcnt?>">
などと書くと、送ることができる。
3.コード(問題と回答欄表示)
<!DOCTYPE html>
<html lang="ja">
<meta charset="utf-8">
<title>linuxコマンドテスト</title>
<?php
$l_cate0=isset($_POST["l_category"])?htmlspecialchars($_POST["l_category"]):null;
$q_num0=isset($_POST["l_num"])?htmlspecialchars($_POST["l_num"]):null;
echo "<h1>linuxコマンドテスト(".$l_cate0.")</h1>";
$ar_quiz=[];
$db_name='linux_quiz3.db';
$ext=file_exists($db_name);
$db1 = new PDO('sqlite:'.$db_name);
$query_all="SELECT * FROM tbl_linux WHERE category0 = ?";
function getQAarray($ar_temp,$num0){
array_splice($ar_temp,$num0,1);
return $ar_temp;
}
$ar_quiz2=[];
$db1 = new PDO('sqlite:'.$db_name);
$result_a=$db1->prepare($query_all);
//パラメータに$l_cate0をセット
$result_a->bindparam(1,$l_cate0);
//実行
$result_a->execute();
//検索結果を配列に格納する
while($select_data=$result_a->fetch(PDO::FETCH_ASSOC)){
array_push($ar_quiz,$select_data['sans0']);
}
$tcnt=count($ar_quiz);
//クイズの部分
if($tcnt>$q_num0){
$tcnt=$q_num0;
}
for($i=0;$i<$tcnt;$i++){
//ランダムにクイズを出す
$num0=rand(0,count($ar_quiz)-1);
array_push($ar_quiz2,$ar_quiz[$num0]);
$ar_quiz=getQAarray($ar_quiz,$num0);
}
?>
<form action="linux_command_test3.php" method="post">
<table>
<!-- クイズと回答欄を作成する。
さらにクイズ部分もhidden属性で送る -->
<?php for($i=0;$i<$tcnt;$i++){ ?>
<tr>
<th align="left"><?=$ar_quiz2[$i]?></th>
<input type="hidden" name="q<?=$i?>" value="<?=$ar_quiz2[$i]?>">
<td><input type="text" name="text<?=$i?>" size=70 maxlength=200></td>
</tr>
<?php } ?>
</table>
<input type="hidden" name="btn2" value="<?=$tcnt?>">
<input type="submit" value="確定">
</form>
<form action="linux_command_test.php" method="post">
<input type="submit" value="戻る">
</form>
</html>
4.問題と回答欄の表示(実行結果)
画面云々の問題では本当にダサい。
でも一応目的は果たしている。
受験勉強でもそうだったけど、[体力をつけるためと食べ倒して10キロ前後太って
醜くなったけど、合格したからそれでよし(実話)]というのと同じかもしれない。
(一人暮らしのストレスで、一気に痩せたけど)
5.コード(テスト結果表示画面)
<!DOCTYPE html>
<html lang="ja">
<meta charset="utf-8">
<title>linuxコマンドテスト(結果)</title>
<h1>linuxコマンドテスト(結果)</h1>
<?php
$db_name='linux_quiz3.db';
$ext=file_exists($db_name);
$db1 = new PDO('sqlite:'.$db_name);
$query_sans="SELECT * FROM tbl_linux WHERE sans0 = ?";
//$qstr:問題 $astr:入力値 入力値と回答が等しいかチェックする関数
function CheckAns($db0,$qry0,$qstr,$astr)
{
$retOKNG="";
$result3=$db0->prepare($qry0);
//パラメータをセット
$result3->bindparam(1,$qstr);
$result3->execute();
//検索結果(回答)を配列に格納する
$select_data=$result3->fetch();
$cmd_str=$select_data['exam0']." ".$select_data['opt0'];
if($cmd_str == $astr){
$retOKNG="○";
}else{
$retOKNG="×";
}
return $retOKNG;
}
if(isset($_POST['btn2'])){
//ボタンの持つ値として総問題数を保持
$cnt0=$_POST['btn2'];
$okcnt=0;
for($i=0;$i<$cnt0;$i++){
$ret0=CheckAns($db1,$query_sans,$_POST["q".$i],$_POST["text".$i]);
if($ret0 == "○"){
$okcnt++;
}
echo $_POST["q".$i].":";
echo $_POST["text".$i].":".$ret0."</br></br>";
}
echo "</br></br>".$cnt0."中".$okcnt."が正解</br></br>";
}
?>
<form action="linux_command_test.php" method="post">
<input type="submit" value="戻る">
</form>
</html>
6.テスト結果表示画面の確認
※赤いペンは、上記を実行しても表示されません。
ただ、結果が表示されていることを強調したかっただけ。
実はこの結果表示の下の部分に「戻る」ボタンが表示されている。