пишу онлайн тест

Mick_20

Новичок
Начал писать онлайн тест и застрял. Нужна помощь.

ТЗ:
- данные в БД
- вопросы выводятся постранично
- у каждого вопроса два ответа (все ответы уникальны. вопросы типа - выберите одно из утверждений)
- в конце вывести на какой вопрос какой дан ответ

Что написал:


PHP:
session_start();

        $db = JFactory::getDbo();
        $query = $db->getQuery(true);
        $query->select('id');
        $query->from('#__aaa_online_tests_questions');
        $query->where("test_id = '1'");
        $query->group("id");
        $db->setQuery($query) or die("запрос1 не сработал");
        $data = $db->loadObjectList();
    
        $a=0;
        foreach ($data as $var)
        {
            $a++;
            $_Session[$a] = $var->id; //засунул в массив сессии все id вопросов текущего теста
            $end_id = $_Session[$a]; //id последнего вопроса
        }

    
        $count=$_Session['1']; //ставим счетчик на первый вопрос
    
            echo 'Вопрос №'.$count.': ';
        
            $query = $db->getQuery(true);
            $query->select('question,A,B');
            $query->from('#__aaa_online_tests_questions');
            $query->where("id = {$count}");
            $db->setQuery($query) or die("запрос1 не сработал");
            $data = $db->loadAssoc();
            $q = $data['question'];
            $a = $data['A'];
            $b = $data['B'];
            ?>
HTML:
            <form action="#" method="POST">
                <h2><?php echo $q; ?></h2>
                <p><input type="radio" name="answer<?php echo $count; ?>" value="a">A) <?php echo $a;?></p>
                <p><input type="radio" name="answer<?php echo $count; ?>" value="b">B) <?php echo $b;?></p>
                <p><input type="submit" name="next" value="Далее"></p>
                <?php if($count == $end_id) {echo "<p>Завершить тест</p>";} ?>
            </form>
PHP:
            <?php
            if (isset($_POST['next'])) //ЕСЛИ НАЖАТА КНОПКА "ДАЛЕЕ"
            {
            
            }
Первый вопрос вывелся без проблем. Все id вопросов в массиве в сессии есть.
Теперь не могу понять как проверить что ответ выбран и самое главное увеличить счетчи чтобы вывести второй вопрос.
 

peon

Lok'tar ogar
Мои мысли (я конечно новичок)

Пишем форму так:

<input type="radio" name="answer" value="a">
<input type="radio" name="answer" value="b">
<input type='hidden' name='qwestion_num' value='{$count}' />

И дальше меняем логику программы на основе следующих параметров:

$_POST['qwestion_num'] -- номер вопроса
$_POST['answer'] -- вариант ответа на вопрос
 

Mick_20

Новичок
Короче сузил пока свой взор на вот что - не записывается значение в переменную сессии:


PHP:
session_start();

if (!empty($_SESSION['quest_id'])) {
    echo $_SESSION['quest_id'];
} else {
    echo 'id вопроса не известен<br /><br />!';
}
HTML:
<form action="#" method="POST">
                <h2><?php echo $q; ?></h2>
                <p><input type="radio" name="answer<?php echo $count; ?>" value="a">A) <?php echo $a;?></p>
                <p><input type="radio" name="answer<?php echo $count; ?>" value="b">B) <?php echo $b;?></p>
                <p><input type="submit" name="next" value="Далее"></p>
                <?php //if($count == $end_id) {echo "<p>Завершить тест</p>";} ?>
            </form>
PHP:
if (isset($_POST['next'])) //ЕСЛИ НАЖАТА КНОПКА "ДАЛЕЕ"
            {
                $_Session['quest_id'] = 44444;
              
            }
При нажатии на кнопку должен вывести присвоенное значение 44444, но он не выводит (
 

peon

Lok'tar ogar
Mick_20, он не должен :) ты должен правильно писать алгоритм

Код:
$count=$_Session['1']; //ставим счетчик на первый вопрос
У тебя $count будет вечно равен 1.
 

Mick_20

Новичок
Mick_20, он не должен :) ты должен правильно писать алгоритм

Код:
$count=$_Session['1']; //ставим счетчик на первый вопрос
У тебя $count будет вечно равен 1.
Пока опустим первый пост :) Что насчет переменной в сессии? Почему не записывает туда по нажатию?
 

Mick_20

Новичок
не понял?
при нажатии записываем в сессию
далее если непустая переменная то выводим
 

Mick_20

Новичок
аа вон оно что... а что обработчики кнопок правильно вверх страницы поднимать?
 

peon

Lok'tar ogar
аа вон оно что... а что обработчики кнопок правильно вверх страницы поднимать?
Тут нужно понимать что происходит в твоем коде.
Можно поместить обработчик вниз. -> Правил нет.

PHP:
session_start();

if (checkNext()) {
    echo $_SESSION['quest_id'];
} else {
    echo 'id вопроса не известен<br /><br />!';
}

function checkNext() {
    if (isset($_POST['next'])) //ЕСЛИ НАЖАТА КНОПКА "ДАЛЕЕ"
    {
      $_SESSION['quest_id'] = 44444;
      return true;
    }

    return false;
}
 

Mick_20

Новичок
Еще вопрос:

Вот я сделал запрос в базу, достал все id вопросов.
Вот записываю в массив сесии эти id:

PHP:
$a=0;
        foreach ($data as $var) 
        {
            $a++;
            $_SESSION[$a] = $var->id; //массив id вопросов
           
        }
А как сделать чтобы массив был такой:

massiv[1][id][ответ]
massiv[2][id][ответ]
massiv[3][id][ответ]
massiv[4][id][ответ]

Ответы будут записываться по проходу по вопросам.
 

ossorian

Новичок
ИМХО - писать столько инфы в сессию - дурной признак перегрузки сервера в будущем.
Храните всё в файлах через serialize и unserialize, привязываясь через uniqid и подчищайте их потом периодически.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
ИМХО - писать столько инфы в сессию - дурной признак перегрузки сервера в будущем.
Храните всё в файлах через serialize и unserialize, привязываясь через uniqid и подчищайте их потом периодически.
ну да, сессия-то хранится в виде пуканья единорогов
 

Redjik

Джедай-мастер
ossorian, ты в курсе, что сессия
хранит все в файлах через serialize и unserialize, привязываясь через uniqid и php подчищает их потом периодически?

ЗЫ.
ИМХО - писать столько инфы в сессию - дурной признак перегрузки сервера в будущем.
HighLoad Master


ЗЫЫ. искал картиночку с highload master - первая картинка в гугле - Fisher =)))
 

ossorian

Новичок
ossorian, ты в курсе, что сессия
хранит все в файлах через serialize и unserialize, привязываясь через uniqid и php подчищает их потом периодически?

ЗЫ

HighLoad Master


ЗЫЫ. искал картиночку с highload master
- первая картинка в гугле - Fisher =)))
был не в курсе. за два года работы нигде не встоечал инфу как вообще хранятся сессии. и что в них вообще можно хранить единорогов. зато форум оживился
 

Mick_20

Новичок
Вот сейчас все id в массиве ttt?

PHP:
$data = $db->loadObjectList(); 

foreach ($data as $var) 
{
$id_array[] = $var->id;
}

for ($i=0; $i < count($id_array); $i++)
{ 
$ttt['qu_id'] = $id_array[$i];
}
 
Сверху