Мини викторина с помощью php

long

New Member
Регистрация
05.11.2022
Сообщения
6
Доброго времени суток уважаемые форумчане! Только начинаю изучать php, и для меня трудная задачка. Требуется сделать нечто похожее на викторину, на экране отображается страница №1 и на ней два вопроса. Под каждым вопросом четыре радиокнопки с вариантами ответов и один из них правильный. Внизу страницы кнопка Next.

После того как пользователь отвечает на вопросы он нажимает Next и оказывается на странице №2, на ней так же два вопроса. Под этими вопросами так же по четыре радиокнопки с вариантами ответов и один из них правильный. Внизу страницы кнопка Finish.

По условию задачи пользователь отвечает на все вопросы и когда он нажимает на кнопку Finish на экран выводятся баллы. За каждый правильный ответ на странице №1 начисляется 1 балл, за каждый правильный ответ на странице №2 ему начисляется 2 балла. За неправильный ответ 0 баллов.

HTML:
<p>страница 1</p>

<form action="source.php">
<p>Вопрос 1. Сколько будет два плюс два?</p>
<input type="radio" name="rQuest1" value="Answer1">
<label for="rQuest1">четыре</lable>
<input type="radio" name="rQuest1" value="Answer1">
<label for="rQuest1">пять</lable>
<input type="radio" name="rQuest1" value="Answer1">
<label for="rQuest1">один</lable>
<input type="radio" name="rQuest1" value="Answer1">
<label for="rQuest1">ноль</lable>
<p>Вопрос 2. Какой формы планета земля?</p>
<input type="radio" name="rQuest2" value="Answer1">
<label for="rQuest2">Шар</lable>
<input type="radio" name="rQuest2" value="Answer1">
<label for="rQuest2">Куб</lable>
<input type="radio" name="rQuest2" value="Answer1">
<label for="rQuest2">Пирамида</lable>
<input type="radio" name="rQuest2" value="Answer1">
<label for="rQuest2">Прямоугольник</lable>
</form>
<br>
<input type="button" value="Next">

<p>страница 2</p>

<form action="source.php">
<p>Вопрос 1. Сколько часов в сутках?</p>
<input type="radio" name="rQuest3" value="Answer1">
<label for="rQuest3">двадцать четыре</lable>
<input type="radio" name="rQuest3" value="Answer1">
<label for="rQuest3">двенадцать</lable>
<input type="radio" name="rQuest3" value="Answer1">
<label for="rQuest3">восемь</lable>
<input type="radio" name="rQuest3" value="Answer1">
<label for="rQuest3">один</lable>
<p>Вопрос 2. Сколько минут в одном часе?</p>
<input type="radio" name="rQuest4" value="Answer1">
<label for="rQuest4">шестьдесят</lable>
<input type="radio" name="rQuest4" value="Answer1">
<label for="rQuest4">десять</lable>
<input type="radio" name="rQuest4" value="Answer1">
<label for="rQuest4">двадцать</lable>
<input type="radio" name="rQuest4" value="Answer1">
<label for="rQuest4">сорок</lable>
</form>
<br>
<input type="button" value="Finish">
Если не затруднит, помогите пожалуйста разобраться.
 

BaNru

Пацифизжу
Команда форума
Регистрация
13.11.2010
Сообщения
4 107
На такой вопрос в рамках форума полный ответ не дать. Писать весь код за вас не будут.

Вам надо или сохранять результаты на сервере в файл или базу данных, либо рассмотреть вариант реализации этого на JS, это будет проше.

В первом случае вам надо научиться работать с файлами (используя их вместо БД), либо с базами данных.
Также надо будет сделать либо авторизацию, либо идентификацию пользователя, например по IP и UserAgent (это ненадёжно).
В случае полноценно авторизации вы сможете хранить данные пользователя и наращивать их, например если будет многовикторин.

Во втором случае на JS (или для упрощения jQuery) - это можно сделать типа слайдера. И когда форма заполнена -слать сразу все результаты на сервер, просчитывать и возвращать результат. В примере у вас по сути написан вариант именно для этого. В этом случае это будет анонимная викторина. Конечно авторизацию никто не мешает тут сделать тоже.

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

Выберите вариант, который хотите сделать, набросайте код и приходите с уточняющими вопросами.
 
Последнее редактирование:

long

New Member
Регистрация
05.11.2022
Сообщения
6
По условию, я не могу пользоваться JS, т.к. это лабораторка по php. SQL - это следующий этап в развитии :), поэтому остаётся только мучить вариант с файлами вместо Б.Д. Создать txt файл и записать в него текст у меня получается вот так:
PHP:
<?php
$userResponses = fopen("user_responses.txt", "a");
$answer = "Пользователь что-то ответил, но это должно прилетать само после нажания на радиокнопку";
fwrite($userResponses, $answer);
echo "user_responses.txt: " . file_get_contents("user_responses.txt") . "<br>";
?>
Но как мне сделать, чтоб ответ сам прилетал по нажатию на радиокнопку?
 

Volly

Well-Known Member
Регистрация
21.03.2012
Сообщения
817
long, надо ли хранить результаты многих испытуемых?
Если это только для запуска одним человеком и хранить не надо, то для памяти при переходе со страницы на страницу. можно использовать сессии или cookie. А совсем уж простой вариант - это скрытые поля, но потребуется или javascript или php.
Это может выглядеть так.
Php-файл один с четырмя блоками.
0 блок - это php-блок обработки полученных данных из форм;
1 блок - вывод формы первых ответов;
2 блок - вывод формы вторых ответов со скрытым полем для хранения первого результата;
3 блок - вывод итогового отчёта.
Логика работы 0 блока примерно такая:
- если не пришли данные радио и скрытого поля, то вывести блок 1;
- если пришли данные из 1 блока, то считать баллы, заполнить скрытое поле у блока 2 и отослать его в браузер;
- если пришли данные из второй формы и скрытого поля, то подсчитать итог и вывести третий блок.
Если нужен отчёт по каждому пункту, то скрытых полей потребуется много.
 

BaNru

Пацифизжу
Команда форума
Регистрация
13.11.2010
Сообщения
4 107
В одном файле хранить не очень хорошо. Я предполагал для каждого пользователя файл.
Но вариант со скрытым полем с общим баллом, вместо ответов, тоже имеет место быть.
То есть не дублировать всю викторину, как изначально я предполагал в одном из вариантов.
Ну и поле с номером вопроса придётся ещё добавить.

Раз это лабораторка, то я бы на вашем месте остановился на нём.

Надеюсь вам понятно о чём речь.

PS вам надо использовать POST, а не GET запрос из формы.
 
Верх Низ