Как сделать тестирование на сайте
В сегодняшней статье собираюсь поведать, как сделать тестирование на сайте. Данное тестирование будет аналогично тому, которое имеется на данном сайте, правда, в упрощённом виде. Сразу говорю, если Ваши знания по PHP и MySQL стремятся к нулю, то можете не читать, а лучше поищите в Интернете готовые скрипты тестов. Для тех же, кто обладает необходимым минимумом, а также хочет узнать, как реализуется тестирование на сайте, я и написал данную статью.
Привожу алгоритм, который Вам потребуется уже преобразовать в PHP+MySQL:
- Создать таблицу с тестами. Здесь достаточно следующих полей: id (уникальный идентификатор), title (название теста), description (описание теста). Можете также добавить количество прошедших данный тест и средний балл. Здесь всё элементарно, и Вы должны справиться с этим без проблем.
- Создать таблицу с вопросами. Здесь нужны следующие поля: id (уникальный идентификатор), test_id (id теста, к которому принадлежит данный вопрос), title (текст вопроса), variant_1 (текст варианта 1), variant_2 (текст варианта 2), correct (правильный ответ). Здесь Вы можете указывать любое количество вариантов, в данном случае, я поставил 2 варианта. В поле "correct" должно стоять число с правильным ответом, например, "1".
- При запуске теста необходимо записать в сессию id тех вопросов, на которые будет отвечать пользователь. Для этого извлеките из базы любое количество вопросов (например, 10 случайных вопросов для выбранного теста) и запишите их id в сессию пользователя. Здесь Вам необходимо записать в сессию массив, где ключами будут id вопросов, а в значении по умолчанию пустая строка. А в будущем будет идти тот ответ, который дал пользователь.
- Вывести первый вопрос из массива, который не имеет ответа (то есть значение равно пустой строке).
- Принять от пользователя ответ и записать в массив с ключом в виде id данного вопроса, ответ, который прислал пользователь.
- Сделать редирект обратно на страницу с вопросами.
- Вернуться к пункту 4, если ещё остались вопросы без ответа. Если на все вопросы были даны ответы, то проверить массив в сессии на соответствие правильным ответам, и вывести окончательный результат.
Давайте разберём 3-й пункт с кодом:
<?php
$arr = array(5, 15, 1, 10, 2); // 5 id вопросов, которые извлекаются из базы
for ($i = 0; $i < count($arr); $i++) {
$arr_questions[$arr[$i]] = "";
}
$_SESSION["questions"] = $arr_questions;
?>
Теперь давайте разберём 5-й пункт, так как он тоже является, возможно, не совсем понятным:
<?php
$question_id = 5; // id вопроса, на который пользователь дал ответ (приходит из формы)
$answer = 1; // ответ, который дал пользователь (приходит из формы)
$_SESSION["questions"]["$question_id"] = $answer; // Записываем в сессию ответ на данный вопрос
?>
Самую суть я разобрал, а уже дальше постарайтесь этот алгоритм применить на практике самостоятельно. Ведь не секрет, что придумать алгоритм гораздо тяжелее, чем его реализовать, и Вам нужно лишь его реализовать, а это не так сложно. Не спорю, алгоритм весьма сложный, но я предупредил вначале статьи, что она не для новичков. И несмотря на то, что алгоритм сложный, в реальности он ещё сложнее может быть, если начать добавлять различные "навороты", например, разбор вопросов в конце, а также каждый раз перемешивать варианты ответов при выводе вопроса.
-
- Михаил Русаков
Комментарии (25):
Добавьте результат этого скрипка с рисунком??
Ответить
Результат здесь: http://myrusakov.ru/tests.html В любой тест заходите вот и будет результат, за вычетом того, что в конце данного скрипта нет разбора вопросов.
Ответить
Да. Было бы не плохо, если бы появились пункты со скринами, или допустим со ссылками для переходу, где можно было бы просмотреть итог.
Ответить
Ничего себе длииииинющая статья. Это рекорд. Прим. - не в обиду автору а просто хочется чтобы темы пошире раскрывались а не абстрактно
Ответить
Здесь люди учатся, а не занимаются копипастом. Если Вам нужен готовый скрипт, то я, помнится, написал в статье, что нужно делать в этом случае. А если Вы пришли сюда учиться, то, будьте любезны, додумайте задачу сами.
Ответить
Михаил, разве тут $_SESSION["questions"][$question_id"] не должна быть кавычка перед $question_id ?
Ответить
Спасибо, исправил.
Ответить
Михаил скажите пожалуйста как мне вытащить все вопросы по определенной теме допустим где test_id=3
Ответить
Уважаемый Андрей,id каждого вопроса теста не должны повторяться. Можно сделать категорию,занести в неё нужные вам тесты,задать ей id,например,3 и при помощи запроса вытащить все данные из неё.
Ответить
Уважаемый Александр Альт если Вам не сложно помогите мне пожалуйста я php знаю на среднем уровне до темы регулярные выражения (учусь по курсу Михаила)но мне срочно нужно сделать тестирование поможете сопровождая меня советами?
Ответить
Буду стараться Вот смотрите,у вас есть айди теста: - 3 в таблице с вопросами у каждого вопроса из этого теста,должен стоять идентификатор 3 в колонке test_id У Михаила разобран вывод по одному вопросу при помощи массива и так по действиям,что,в принципе и актуально для теста. Cуть примерно такая. Подключаетесь к базе данных при помощи php. Думаю у Михаила этот вопрос разобран в курсах,так что вдаваться в подробности не буду. После этого создаёте запрос к таблице и выводите данные из неё при помощи массива: $row = mysql_fetch_array(mysql_query("SELECT * FROM таблица WHERE test_id=`3`",$имя переменной,где задан коннект к базе данных); потом выводите результат при помощи команды echo, включив нужные вам данные в вывод. echo $row['title']; Выведет название вопроса) Ну,можно вывести название,далее варианты ответов и т.д. Это как обычный вывод массива
Ответить
все понял кроме этого момента Вот смотрите,у вас есть айди теста: - 3 в таблице с вопросами у каждого вопроса из этого теста,должен стоять идентификатор 3 в колонке test_id на данный момент я создал отдельную базу kontrol и в ней две таблицы testi с полями id и title(тема тестов) и таблицу vopros с полями id id_test title_vopros(Текст вопроса) variant_1 variant_2 variant_3 variant_4 и поле correct это чтобы Вы видели ситуацию изнутри теперь вопрос как подставить эти данные в форму (тоесть заголовок варианты и т.д) обе таблицы я заполнил по одной записи в нужных полях
Ответить
Ну вот. Вытаскиваете этим запросом: $row = mysqli_fetch_array(mysqli_query("SELECT * FROM таблица WHERE test_id=`3`",$имя переменной,где задан коннект к базе данных); все данные из таблицы,у которых параметр test_id = 3 mysqli_fetch_array - этим вы добавили все данные из всех колонок,test_id которых равен 3,в массив =) Ну вот,а теперь выводите,создавая внешний вид теста например:echo $row['title_vopros']; - текст вопроса. Следующей строчкой: echo $row['variant_1']; - выведет первый вариант ответа и так далее,формируя тело отображения теста Про привязку к форме отпишу чуть позже.
Ответить
на данный момент я вывел из базы тему теста вопрос теста и варианты ответа вот файл testing.php <?php $disk=mysql_connect("localhost","Admin","5577"); if($disk==true) echo "подключились"."<br/>"; else echo "неудача"."<br/>"; $obr=mysql_select_db("kontrol",$disk); if($obr==true) echo "обратились"."<br/>"; else echo "неудача"."<br/>"; $result=mysql_query("SELECT * FROM vopros",$disk); if($result==true) echo "вывели"."<br/>"; else echo "не вывели"."<br/>"; $resultat=mysql_query("SELECT * FROM testi",$disk); if($result==true) echo "вывели"."<br/>"; else echo "не вывели"."<br/>"; $myrow=mysql_fetch_array($result); if($myrow==true) echo "занесли"."<br/>"; else echo "не занесли"."<br/>"; echo "<br/>"; echo "<br/>"; $myr=mysql_fetch_array($resultat); if($myrow==true) echo "занесли"."<br/>"; else echo "не занесли"."<br/>"; echo "<br/>"; echo "<br/>"; mysql_close($disk); $title=$myr['title']; $title_vopros=$myrow['title_vopros']."<br/>"; $variant_1=$myrow['variant_1']."<br/>"; $variant_2=$myrow['variant_2']."<br/>"; $variant_3=$myrow['variant_3']."<br/>"; $variant_4=$myrow['variant_4']."<br/>"; include("select_testing.php"); echo "<br/>"; ?> а вот файл select_testing.php <div class="content"> ТЕСТОВЫЙ КОНТРОЛЬ. <p align="center"><?php echo $title;?></p> <p><b><?php echo $title_vopros;?></b></p> <form name="opros" action="" method="POST"> <input type="radio" name="id1" value="5"><?php echo $variant_1;?><hr> <br> <input type="radio" name="id1" value="4"><?php echo $variant_2;?><hr> <br> <input type="radio" name="id1" value="3"><?php echo $variant_3;?><hr> <br> <input type="button" name="golos" value="Следующий вопрос"> </form> </div> хотя все выводит но все же проверьте правильно ли здесь все и еще вопрос в таблице у меня 4 поля вариантов а в данном вопросе 3 (тоесть четвертое поле в таблице пустое)не вызовет ли это в будущем сбой? и еще как сделать чтобы при нажатии на следующий вопрос выводился следующий из таблицы?? (пока там всего один вопрос)
Ответить
Здравствуйте Андрей. Пустое поле в таблице не как не повлияет на работу в целом. Чтобы выводился следующий вопрос из таблицы читайте внимательно пункты 2-7 и делайте по аналогии.
Ответить
Здравствуйте а можно как то обойтись без сессий? я их еще не изучал а тупо копировать я не хочу так как потом сам же не разберусь в коде в случае чего
Ответить
Андрей, в сессиях нет ничего страшного, изучайте их так как они очень важные. Сделать это без сессий, Вам будет не возможно.
Ответить
Скажите как сделать так чтобы при нажатии следующий вопрос выводился следуший вопрос? если можно пример пожалуйста
Ответить
Лучше реализовать одной кнопкой "Ответ" и после ее нажатия, пользователю автоматически подается следующий вопрос. Реализовать можно множеством способов, зависит от того, как у Вас работает система, можно AJAX'ом допустим.
Ответить
нет аякс не использую можно как то по другому ? я слышал get запросом как то можно\\\подскажите код
Ответить
пример из двух файлов, форма отправки находится в файле form.php, а обработчик в файле add.php. Файлы Вы можете конечно называть как вам угодно, лишь придерживаясь правильности именования файлов и правильно указывайте путь к обработчику. Создайте form.php и добавьте следующий код: <form method="GET" action="add.php"> <label> <input type="text" name="page" id="textfield"> </label> <label> <input type="submit" name="button" id="button" value="Отправить"> </label> </form> Затем, создайте add.php и в него добавьте следующее: <?php echo $_GET['page']; ?> Затем, запустите form.php и увидите результат работы передачи данных методом GET.
Ответить
у меня все получилось но все вопросы выводятся на одной странице как это исправить?
Ответить
можно было бы и лучше описать алгоритм... к примеру, каким циклом выводить вопросы, так что бы выводились не все сразу... а последовательно, скажем при нажатии на кнопку, а предыдущий вносился бы в сессию
Ответить
Вывести первый вопрос из массива, который не имеет ответа (то есть значение равно пустой строке). Трудность испытываю в этом пункте. Можете помочь?
Ответить
Спасибо Михаил за статью. У меня вопрос, если например мне для тестирования нужны всего 20 вопросов из 100 которые хранятся в БД, лучше ли будет если я сделаю запрос к бд , получу эти 20 вопросов, загоню их в массив на javascript и с помощью js уже буду обращаться к вопросам.(т.е. просто чтоб из-за 20 вопросов не обращаться каждый раз к базе)? лучше будет так или полный бред ))) ????
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.