<MyRusakov.ru />

Создание движка на PHP и MySQL 2.0

Создание движка на PHP и MySQL 2.0

Видеокурс "Создание движка на PHP и MySQL 2.0" научит Вас создавать профессиональные движки для сайтов на PHP и MySQL с использованием ООП и паттерна MVC.

В курсе разобрана вся теория по структуре движка: как всё устроено, какие должны быть объекты, какая у них иерархия и как они взаимодействуют между собой.

В практической части будет создан движок с чистого листа. Будет создано ядро, все адаптеры, все вспомогательные классы, а также классы для работы с объектами базы данных. И чтобы курс был максимально полезным, будет создан движок для сайта MyRusakov.ru.

Подробнее
Подписка

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Каким движком Вы предпочитаете пользоваться?

Как сделать тестирование на сайте

Как сделать тестирование на сайте

В сегодняшней статье собираюсь поведать, как сделать тестирование на сайте. Данное тестирование будет аналогично тому, которое имеется на данном сайте, правда, в упрощённом виде. Сразу говорю, если Ваши знания по PHP и MySQL стремятся к нулю, то можете не читать, а лучше поищите в Интернете готовые скрипты тестов. Для тех же, кто обладает необходимым минимумом, а также хочет узнать, как реализуется тестирование на сайте, я и написал данную статью.

Привожу алгоритм, который Вам потребуется уже преобразовать в PHP+MySQL:

  1. Создать таблицу с тестами. Здесь достаточно следующих полей: id (уникальный идентификатор), title (название теста), description (описание теста). Можете также добавить количество прошедших данный тест и средний балл. Здесь всё элементарно, и Вы должны справиться с этим без проблем.
  2. Создать таблицу с вопросами. Здесь нужны следующие поля: id (уникальный идентификатор), test_id (id теста, к которому принадлежит данный вопрос), title (текст вопроса), variant_1 (текст варианта 1), variant_2 (текст варианта 2), correct (правильный ответ). Здесь Вы можете указывать любое количество вариантов, в данном случае, я поставил 2 варианта. В поле "correct" должно стоять число с правильным ответом, например, "1".
  3. При запуске теста необходимо записать в сессию id тех вопросов, на которые будет отвечать пользователь. Для этого извлеките из базы любое количество вопросов (например, 10 случайных вопросов для выбранного теста) и запишите их id в сессию пользователя. Здесь Вам необходимо записать в сессию массив, где ключами будут id вопросов, а в значении по умолчанию пустая строка. А в будущем будет идти тот ответ, который дал пользователь.
  4. Вывести первый вопрос из массива, который не имеет ответа (то есть значение равно пустой строке).
  5. Принять от пользователя ответ и записать в массив с ключом в виде id данного вопроса, ответ, который прислал пользователь.
  6. Сделать редирект обратно на страницу с вопросами.
  7. Вернуться к пункту 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; // Записываем в сессию ответ на данный вопрос
?>

Самую суть я разобрал, а уже дальше постарайтесь этот алгоритм применить на практике самостоятельно. Ведь не секрет, что придумать алгоритм гораздо тяжелее, чем его реализовать, и Вам нужно лишь его реализовать, а это не так сложно. Не спорю, алгоритм весьма сложный, но я предупредил вначале статьи, что она не для новичков. И несмотря на то, что алгоритм сложный, в реальности он ещё сложнее может быть, если начать добавлять различные "навороты", например, разбор вопросов в конце, а также каждый раз перемешивать варианты ответов при выводе вопроса.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (25):

Sirojiddin Ashti Sirojiddin Ashti 06.02.2012 14:29:14

Добавьте результат этого скрипка с рисунком??

Ответить

Admin Admin 06.02.2012 15:14:29

Результат здесь: http://myrusakov.ru/tests.html В любой тест заходите вот и будет результат, за вычетом того, что в конце данного скрипта нет разбора вопросов.

Ответить

Screen Screen 06.02.2012 15:01:44

Да. Было бы не плохо, если бы появились пункты со скринами, или допустим со ссылками для переходу, где можно было бы просмотреть итог.

Ответить

yurfact yurfact 07.02.2012 15:16:12

Ничего себе длииииинющая статья. Это рекорд. Прим. - не в обиду автору а просто хочется чтобы темы пошире раскрывались а не абстрактно

Ответить

Admin Admin 07.02.2012 16:07:54

Здесь люди учатся, а не занимаются копипастом. Если Вам нужен готовый скрипт, то я, помнится, написал в статье, что нужно делать в этом случае. А если Вы пришли сюда учиться, то, будьте любезны, додумайте задачу сами.

Ответить

Нур-Мохмад Нур-Мохмад 30.07.2012 12:00:51

Михаил, разве тут $_SESSION["questions"][$question_id"] не должна быть кавычка перед $question_id ?

Ответить

Admin Admin 30.07.2012 18:37:00

Спасибо, исправил.

Ответить

SARUMAN7 SARUMAN7 17.11.2013 13:35:34

Михаил скажите пожалуйста как мне вытащить все вопросы по определенной теме допустим где test_id=3

Ответить

alexandrdante alexandrdante 17.11.2013 13:56:32

Уважаемый Андрей,id каждого вопроса теста не должны повторяться. Можно сделать категорию,занести в неё нужные вам тесты,задать ей id,например,3 и при помощи запроса вытащить все данные из неё.

Ответить

SARUMAN7 SARUMAN7 17.11.2013 14:23:17

Уважаемый Александр Альт если Вам не сложно помогите мне пожалуйста я php знаю на среднем уровне до темы регулярные выражения (учусь по курсу Михаила)но мне срочно нужно сделать тестирование поможете сопровождая меня советами?

Ответить

alexandrdante alexandrdante 17.11.2013 14:51:31

Буду стараться Вот смотрите,у вас есть айди теста: - 3 в таблице с вопросами у каждого вопроса из этого теста,должен стоять идентификатор 3 в колонке test_id У Михаила разобран вывод по одному вопросу при помощи массива и так по действиям,что,в принципе и актуально для теста. Cуть примерно такая. Подключаетесь к базе данных при помощи php. Думаю у Михаила этот вопрос разобран в курсах,так что вдаваться в подробности не буду. После этого создаёте запрос к таблице и выводите данные из неё при помощи массива: $row = mysql_fetch_array(mysql_query("SELECT * FROM таблица WHERE test_id=`3`",$имя переменной,где задан коннект к базе данных); потом выводите результат при помощи команды echo, включив нужные вам данные в вывод. echo $row['title']; Выведет название вопроса) Ну,можно вывести название,далее варианты ответов и т.д. Это как обычный вывод массива

Ответить

SARUMAN7 SARUMAN7 17.11.2013 15:14:41

все понял кроме этого момента Вот смотрите,у вас есть айди теста: - 3 в таблице с вопросами у каждого вопроса из этого теста,должен стоять идентификатор 3 в колонке test_id на данный момент я создал отдельную базу kontrol и в ней две таблицы testi с полями id и title(тема тестов) и таблицу vopros с полями id id_test title_vopros(Текст вопроса) variant_1 variant_2 variant_3 variant_4 и поле correct это чтобы Вы видели ситуацию изнутри теперь вопрос как подставить эти данные в форму (тоесть заголовок варианты и т.д) обе таблицы я заполнил по одной записи в нужных полях

Ответить

alexandrdante alexandrdante 17.11.2013 18:12:51

Ну вот. Вытаскиваете этим запросом: $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']; - выведет первый вариант ответа и так далее,формируя тело отображения теста Про привязку к форме отпишу чуть позже.

Ответить

SARUMAN7 SARUMAN7 18.11.2013 12:01:13

на данный момент я вывел из базы тему теста вопрос теста и варианты ответа вот файл 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 (тоесть четвертое поле в таблице пустое)не вызовет ли это в будущем сбой? и еще как сделать чтобы при нажатии на следующий вопрос выводился следующий из таблицы?? (пока там всего один вопрос)

Ответить

tikkiwiki tikkiwiki 18.11.2013 16:33:50

Здравствуйте Андрей. Пустое поле в таблице не как не повлияет на работу в целом. Чтобы выводился следующий вопрос из таблицы читайте внимательно пункты 2-7 и делайте по аналогии.

Ответить

SARUMAN7 SARUMAN7 18.11.2013 16:50:19

Здравствуйте а можно как то обойтись без сессий? я их еще не изучал а тупо копировать я не хочу так как потом сам же не разберусь в коде в случае чего

Ответить

tikkiwiki tikkiwiki 18.11.2013 17:26:34

Андрей, в сессиях нет ничего страшного, изучайте их так как они очень важные. Сделать это без сессий, Вам будет не возможно.

Ответить

SARUMAN7 SARUMAN7 20.11.2013 15:55:38

Скажите как сделать так чтобы при нажатии следующий вопрос выводился следуший вопрос? если можно пример пожалуйста

Ответить

tikkiwiki tikkiwiki 20.11.2013 16:44:25

Лучше реализовать одной кнопкой "Ответ" и после ее нажатия, пользователю автоматически подается следующий вопрос. Реализовать можно множеством способов, зависит от того, как у Вас работает система, можно AJAX'ом допустим.

Ответить

SARUMAN7 SARUMAN7 20.11.2013 16:55:37

нет аякс не использую можно как то по другому ? я слышал get запросом как то можно\\\подскажите код

Ответить

tikkiwiki tikkiwiki 20.11.2013 17:06:04

пример из двух файлов, форма отправки находится в файле 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.

Ответить

SARUMAN7 SARUMAN7 24.11.2013 10:02:45

у меня все получилось но все вопросы выводятся на одной странице как это исправить?

Ответить

webomax webomax 13.05.2014 19:38:38

можно было бы и лучше описать алгоритм... к примеру, каким циклом выводить вопросы, так что бы выводились не все сразу... а последовательно, скажем при нажатии на кнопку, а предыдущий вносился бы в сессию

Ответить

Teodor86 Teodor86 02.08.2015 11:22:01

Вывести первый вопрос из массива, который не имеет ответа (то есть значение равно пустой строке). Трудность испытываю в этом пункте. Можете помочь?

Ответить

archer8827 archer8827 01.09.2015 16:03:09

Спасибо Михаил за статью. У меня вопрос, если например мне для тестирования нужны всего 20 вопросов из 100 которые хранятся в БД, лучше ли будет если я сделаю запрос к бд , получу эти 20 вопросов, загоню их в массив на javascript и с помощью js уже буду обращаться к вопросам.(т.е. просто чтоб из-за 20 вопросов не обращаться каждый раз к базе)? лучше будет так или полный бред ))) ????

Ответить

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.