0
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-12-27

1.前回の続き(概要)

前回の記事の続き
【PHP+SQLite3】ping-tのコマンド問題ライクなページ1 --ボタン表示切り替えに難問が!!--

(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.コード(問題と回答欄表示)

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>

4.問題と回答欄の表示(実行結果)

command_test2.jpg

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

(一人暮らしのストレスで、一気に痩せたけど)

5.コード(テスト結果表示画面)

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>

6.テスト結果表示画面の確認

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

command_test3.jpg

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0