PHP-обработка и сравнение ответов в случайном тесте

Утро:

Это мой первый вопрос, я постараюсь быть максимально корректным. (И извините за мой английский)

Я пытаюсь создать тест со случайными Q / A, взятыми из базы данных дат. Структура DDBB что-то вроде этого:

preguntas -> id(int), pregunta (varchar)

respuestas — > id (int), pregid( int), respuesta( varchar), correcta (boolean/tinyint)

(Названия таблиц на испанском языке, извините за неудобство)

Код формы это:

    <form  role="form" method="post"><!--ORDER BY RAND() LIMIT 0,10-->
    <?php 

            $recogepre = $pdo->query('SELECT * FROM preguntas ORDER BY RAND() LIMIT 0,10');
            while($row = $recogepre->fetch(PDO::FETCH_ASSOC) ){
                echo "<br><p>".$row['pregunta']."</p>";

                    $recogeres = $pdo->query("SELECT * FROM respuestas WHERE pregid='".$row["id"]."' ORDER BY RAND() LIMIT 0,30");
                    while ($row2 = $recogeres->fetch(PDO::FETCH_ASSOC)) {
                    echo "<input type="radio" name="preg-".$row["id"]."" value="".$row2["id"].""> ".$row2["respuesta"]."</br>";
                    }
                }

        ?>


    <br><br>
        <input type="submit" name="enviar" value="Enviar"> 
        <?php 
        if ($_SERVER['REQUEST_METHOD'] == 'POST') {

        }

         ?>

    </form>

Код работает, и он отображает Q/A случайным образом. Я хотел бы знать, как сравнить ответы, данные пользователем, с правильным ответом и изменить расположение страницы на другое, чем показывает данные ответы и правильные.

Спасибо и извините, если я был груб…

1 ответ

  1. <form  role="form" method="post"><!--ORDER BY RAND() LIMIT 0,10-->
        <?php 
                session_start();
                $_SESSION['questions'] = array();
                $_SESSION['answers'] = array();
                $recogepre = $pdo->query('SELECT * FROM preguntas ORDER BY RAND() LIMIT 0,10');
                $question_number = 1;
                while($row = $recogepre->fetch(PDO::FETCH_ASSOC) ){
                    $_SESSION['questions'][$row['id']] = [
                        'question_id'=>$row['id'], 
                        'question'=>$row['pregunta'],
                    ];
                    echo "<br><p>".$row['pregunta']."</p>";
    
                    $recogeres = $pdo->query("SELECT * FROM respuestas WHERE pregid='".$row["id"]."' ORDER BY RAND() LIMIT 0,30");
                    while ($row2 = $recogeres->fetch(PDO::FETCH_ASSOC)) {
                        $_SESSION['answers'][$row2['id']] = [
                            'answer_id'=>$row2['id'], 
                            'question_id'=>$row['id'], 
                            'answer'=>$row2["respuesta"], 
                            'is_correct'=>$row2['correcta']
                        ];
                        echo "<input type=\"radio\" name=\"preg-".$question_number."\" value=\"".$row2["id"]."\"> ".$row2["respuesta"]."</br>"; //edit
                    }
                    $question_number++;
                }
    
            ?>
    
    
        <br><br>
            <input type="submit" name="enviar" value="Enviar"> 
            <?php 
            if ($_SERVER['REQUEST_METHOD'] == 'POST') {
                $answered_question_number = 1;
                $submitted_answer_name = "preg-".$answered_question_number;
                $feedback_answer_dataset = array();
                while($answer_id = $_POST[$submitted_answer_name]){
                    $answer = $_SESSION['answers'][$answer_id];
                    if($answer["is_correct"]){
                        $feedback_answer_dataset[] = [
                            "question"=>$_SESSION['questions'][$answer['question_id']],
                            "selected_answer"=>$answer["answer"], 
                            "correct_answer"=>$answer["answer"], 
                            "remark"=>"You chose the correct answer!"
                        ];
                    } else {
                        $correct_answer_result = $pdo->query("SELECT * FROM respuestas WHERE pregid={$answer['question_id']} AND correcta=TRUE LIMIT 1");
                        $correct_answer = $correct_answer_result->fetch(PDO::FETCH_ASSOC))
                        $feedback_answer_dataset[] = [
                            "question"=>$_SESSION['questions'][$answer['question_id'],
                            "selected_answer"=>$answer["answer"], 
                            "correct_answer"=>$correct_answer["respuesta"], 
                            "remark"=>"You chose the wrong answer!"]
                        ];
                    }
                    $answered_question_number++;
                    $answer_key = "preg-".$answered_question_number;
                }
            }
    
             ?>
    
        </form>
    

    Я отредактировал несколько строк из вашего кода и добавил еще немного кода.

    То, что я сделал, это дать вопросы последовательный идентификатор в форме, так что я могу циклически через него последовательно в блоке кода обработки формы. Кроме того, я сохранил результаты вашего запроса в переменной $_SESSION, чтобы нам не пришлось выполнять тот же запрос снова при обработке.

    При обработке формы каждый вопрос берется из $_SESSION и проверяется на корректность, если нет, то из БД извлекается правильный ответ с тем же идентификатором вопроса. Все помещается в массив ассоциативных массивов для каждого вопроса. Вы можете использовать это, как вы хотите в html для вашей страницы обратной связи.

    Если вы хотите, чтобы обработка формы происходила в отдельном скрипте, вы можете сделать это, включив атрибут «action» в тег.

    Я надеюсь, что это сработает для вас.