1.前回の続き(概要)
前回の記事の続き
ping-tのコマンド問題ライクなページ1(PHP) --ボタン表示切り替えに難問が!!--
(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.コード(問題と回答欄表示)
php linux_command_test2.php
<!DOCUTYPEhtml><htmllang="ja"><metacharset="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=newPDO('sqlite:'.$db_name);$query_all="SELECT * FROM tbl_linux WHERE category0 = ?";functiongetQAarray($ar_temp,$num0){array_splice($ar_temp,$num0,1);return$ar_temp;}$ar_quiz2=[];$db1=newPDO('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);}?><formaction="linux_command_test3.php"method="post"><table><!-- クイズと回答欄を作成する。
さらにクイズ部分もhidden属性で送る --><?phpfor($i=0;$i<$tcnt;$i++){?><tr><thalign="left"><?=$ar_quiz2[$i]?></th><inputtype="hidden"name="q<?=$i?>"value="<?=$ar_quiz2[$i]?>"><td><inputtype="text"name="text<?=$i?>"size=70maxlength=200></td></tr><?php}?></table><inputtype="hidden"name="btn2"value="<?=$tcnt?>"><inputtype="submit"value="確定"></form><formaction="linux_command_test.php"method="post"><inputtype="submit"value="戻る"></form></html>4.問題と回答欄の表示(実行結果)
画面云々の問題では本当にダサい。
でも一応目的は果たしている。
受験勉強でもそうだったけど、[体力をつけるためと食べ倒して10キロ前後太って
醜くなったけど、合格したからそれでよし(実話)]というのと同じかもしれない。
(一人暮らしのストレスで、一気に痩せたけど)
5.コード(テスト結果表示画面)
php linux_command_test3.php
<!DOCUTYPEhtml><htmllang="ja"><metacharset="utf-8"><title>linuxコマンドテスト(結果)</title><h1>linuxコマンドテスト(結果)</h1><?php$db_name='linux_quiz3.db';$ext=file_exists($db_name);$db1=newPDO('sqlite:'.$db_name);$query_sans="SELECT * FROM tbl_linux WHERE sans0 = ?";//$qstr:問題 $astr:入力値 入力値と回答が等しいかチェックする関数functionCheckAns($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>";}?><formaction="linux_command_test.php"method="post"><inputtype="submit"value="戻る"></form></html>6.テスト結果表示画面の確認
※赤いペンは、上記を実行しても表示されません。
ただ、結果が表示されていることを強調したかっただけ。
実はこの結果表示の下の部分に「戻る」ボタンが表示されている。

