Тест на PHP: можно ли ещё проще, чем проще :)
"Очень простые тесты на PHP", в смысле простоты их программирования, в этом блоге уже есть, хотя по-настоящему просто - это когда листинг умещается на одном экране проектора :)
Чтобы так сделать, наверное, придётся отказаться от нескольких типов вопросов и ограничиться чем-то одним.
Вот пример для случая, когда в качестве ответов на вопросы выбираются флажки-checkbox'ы, то есть, выбор сводится к отметке верных или неверных утверждений из предложенных. Вопросы хранятся в массиве $questions
, а ответы (нули и единицы, информация о состоянии очередного чекбокса при правильном ответе на вопрос) - в массиве $answers
.
Дальше с помощью условного оператора программируем два состояния скрипта (вывод формы и вывод результатов) - и всё.
<?php $questions = array ('2*2=4','3-7=4','5+1=7','3*2=6'); $answers = array (1,0,0,1); if (isset($_POST['result'])) { //Результаты $cnt = 0; foreach ($answers as $index=>$answer) { if (!isset($_POST['r'.$index])) $my_answer=0; else $my_answer=1; //checkbox не шлёт данных, если он не выбран if ($my_answer==$answer) $cnt++; } echo 'Верно: '.$cnt.' из '.count($answers). ' <a href="'.$_SERVER['HTTP_REFERER'].'">Ещё раз</a>'; } else { //Форма для заполнения echo '<form method="post">'."\n"; foreach ($questions as $index=>$question) { $num = 'r'.$index; echo '<input type="checkbox" name="'.$num.'" id="'.$num.'" value="1">'. '<label for="'.$num.'">'.$question.'</label><br>'."\n"; } echo '<input type="submit" name="result" value="ОК"></form>'."\n"; } ?>

скриншот мини-теста 1 в работе
С помощью меток <label>
сделано так, что щёлкать можно по тексту вопроса, а не только по "квадратику" самого чекбокса.
Типовое обрамление HTML пропущено, но показанные коды вместе с тегом <?php ?>
легко вставить, например, в этот шаблон вместо слов "Содержимое документа"
Если ответами будет ввод целых чисел в стандартные поля ввода текста, шаблон изменится не слишком сильно:
<?php $questions = array ('2+2=','3-7=','5+1=','3*3='); $answers = array(4,-4,6,9); if (isset($_POST['result'])) { //переданы результаты $cnt = 0; foreach ($answers as $index=>$answer) { if (isset($_POST['r'.$index])) $my_answer = intval(trim($_POST['r'.$index])); else $my_answer = ''; if ($my_answer == $answer) $cnt++; } echo 'Верно: '.$cnt.' из '.count($answers). ' <a href="'.$_SERVER['HTTP_REFERER'].'">Ещё раз</a>'; } else { //вывести форму echo '<form method="post">'."\n"; foreach ($questions as $index=>$question) echo $question.' <input type="text" name="r'. $index.'" size="2" maxlength="2" value=""><br>'."\n"; echo '<input type="submit" name="result" value="OK"></form>'."\n"; } ?>
Теперь в массиве $answers
хранятся правильные ответы в виде целых чисел, которые пользователь должен ввести в поля формы при ответе на вопросы теста:

скриншот мини-теста 2 в работе
Напоминаю, что выполнять это нужно на локальном сервере, а не из файловой системы. Проверял в XAMPP с текущей версией PHP 7.X и Windows 10.
Если придраться к тому, что информация о вопросе и ответе хранится в разных массивах, и не допускать, чтобы тексты вопросов служили атрибутами элементов формы (вдруг в них есть двойная кавычка или ещё что подобное), то, наверное, можно сделать так:
<?php $test = array ( '2*2=4' => 1,'3-7=4' => 0,'5+1=7' => 0,'3*2=6' => 1 ); if (isset($_POST['result'])) { $cnt = $index = 0; foreach ($test as $question=>$answer) { if (!isset($_POST['r'.$index])) $my_answer=0; else $my_answer=1; if ($my_answer == $answer) $cnt++; $index++; } echo 'Верно: '.$cnt.' из '.count($test). ' <a href="'.$_SERVER['HTTP_REFERER'].'">Ещё раз</a>'; } else { echo '<form method="post">'."\n"; $index = 0; foreach ($test as $question=>$answer) { $num = 'r'.$index; echo '<input type="checkbox" name="'.$num.'" id="'.$num.'" value="1">'. '<label for="'.$num.'">'.$question.'</label><br>'."\n"; $index++; } echo '<input type="submit" name="result" value="ОК"></form>'."\n"; } ?>
И со вторым видом теста по аналогии.
25.09.2019, 10:54 [1397 просмотров]