【PHP+SQLite3】 ping-tライクなページ2(ただしチャチ)~魔法のhidden属性~

###１．前回の続き(概要)
前回の記事の続き
[【PHP+SQLite3】ping-tのコマンド問題ライクなページ１ --ボタン表示切り替えに難問が！！--]
(https://qiita.com/knowledge87sun/items/31f02bd3a08b72d0ea88)

(1)カテゴリーと問題数を選択
(2)問題をランダムに表示する。--->ここからスタート
(3)入力後、答え合わせするときは確定ボタン(linux_command_test3.phpへ遷移)を、
回答しないで戻りたいときは「戻る」ボタンを押す(linux_command_test.phpへ遷移)
(4)確定ボタンを押すと、入力値とデータベースに登録された回答をチェックし、
問題に対する結果を表示する。(あっていれば〇、間違っていれば×)
さらに全体の問題数に対する正解数も表示する。

###２.hidden属性
ボタンを押したときやテキストボックスの入力値(回答:\$textN(N=1,2...))以外にも、
別のページで利用したいデータがある。
今回の場合で言えば、
「問題の内容」(\$ar_quiz2N)だったり、「総問題数」($tcnt)がそれにあたる。
そんな時に、テキストボックスやボタン名などの前に

\<input type="hidden" name="btn2" value="<?=$tcnt?>"\>
などと書くと、送ることができる。


###３．コード(問題と回答欄表示)
```php:linux_command_test2.php 
<!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>

```

###４．問題と回答欄の表示(実行結果)
![command_test2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494408/b0ec2190-eed0-2796-a4b3-5012fd522255.jpeg)

画面云々の問題では本当にダサい。
でも一応目的は果たしている。
__受験勉強でもそうだったけど、[体力をつけるためと食べ倒して10キロ前後太って
醜くなったけど、合格したからそれでよし(実話)]というのと同じかもしれない。__
(一人暮らしのストレスで、一気に痩せたけど)

###５．コード(テスト結果表示画面)
```php:linux_command_test3.php

<!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>
```

###６．テスト結果表示画面の確認
※赤いペンは、上記を実行しても表示されません。
ただ、結果が表示されていることを強調したかっただけ。
実はこの結果表示の下の部分に「戻る」ボタンが表示されている。

![command_test3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494408/1196e26f-6a08-9bf5-9af2-08eb084cbac8.jpeg)