【PHP+SQLite3】 ping-t라이크인 페이지 2(단 처치)~마법의 hidden 속성~

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)가 거기에 해당한다.
그럴 때 텍스트 상자나 버튼 이름 등 앞에


등이라고 쓰면 보낼 수 있다.

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. 문제 및 답변 열 표시 (실행 결과)





화면운동의 문제로는 정말 어색하다.
하지만 일단 목적은 과연 있다.
수험 공부에서도 그랬지만,
추악해졌지만, 합격했기 때문에 그것이 좋다(실화)]라고 하는 것과 같을지도 모른다.
(혼자 생활의 스트레스로 단번에 마른 했지만)

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. 테스트 결과 표시 화면 확인



※붉은 펜은 상기를 실행해도 표시되지 않습니다.
단지, 결과가 표시되고 있는 것을 강조하고 싶었을 뿐.
실은 이 결과 표시의 아래 부분에 「뒤로」버튼이 표시되어 있다.

좋은 웹페이지 즐겨찾기