Как отображать только одни данные за раз в онлайн-викторине

Ранее я создал текстовый файл и превратил его в многомерный массив для отображения в качестве вопросов для моей викторины.

Примечание. Я не могу вставлять изображения, поэтому не могу привести какой-либо пример, поэтому постараюсь быть как можно более описательным.

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

Это мой код до сих пор. Страница main.php:

<h2>ONLINE QUIZ</h2>
<ul>
    <li><a href='question.php'>Take quiz</a></li>
    <li><a href='module.php'>Admin Module</a></li>
</ul>
<?php

$file = fopen('data.txt', 'r');

$array = array();
while ($line = fgetcsv($file)) {
    $array[] = $line;
}

fclose($file);

session_start();
$_SESSION["questions_array"]=$array;

?>

И страница question.php:

<?php

session_start();
$array=$_SESSION["questions_array"];

foreach ($array as $q => $data) {
    echo '<p>'.array_shift($data).'</p>';
    foreach ($data as $a => $answer) {
        echo 
             '  <input type="radio" name="question-'.$q.'" id="question-'.$q.'"'.
             '         value="'.$a.'"/>'.
             '  <label for="question-'.$q.'">'.$answer.'</label>'.
             '<br>';
    }

}

?>

При нажатии на ссылку Take quiz пользователь попадает на страницу вопроса, где отображается только один вопрос. Затем пользователь выбирает ответ и нажимает submit. Эта кнопка отправки перенаправит пользователя на страницу результатов, где он сможет нажать continue.

Ссылка Continue перенаправит их обратно на страницу вопроса, где отображается следующий вопрос.

Из того, что я делал раньше, я пытаюсь использовать функцию isset(), чтобы это произошло. Однако проблема в том, что я не уверен, как именно написать свой isset().

Я нашел этот фрагмент с этого сайта, я не уверен, что он полезен, но:

if (!isset($_SESSION['FirstVisit'])) {

    //show site for the first time part
    $_SESSION['FirstVisit] = 1;
    header("Location: http://example.com/index.php");

    // Don't forget to add http colon slash slash www dot before!

    } else { Show normal site }

Но я снова оказался пустым. Как именно использовать isset() для отображения только одного вопроса?


person user1344705    schedule 19.04.2012    source источник
comment
Можете ли вы дать нам var_dump вашего массива $_SESSION?   -  person Matt Moore    schedule 20.04.2012
comment
($q, $a, $ответ, $данные)   -  person user1344705    schedule 20.04.2012
comment
Это не то, о чем я просил... do var_dump($_SESSION[questions_array]); на странице вопросов и разместить результаты здесь.   -  person Matt Moore    schedule 20.04.2012


Ответы (2)


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

РЕДАКТИРОВАТЬ:

Поскольку я такой хороший парень, вот полный сценарий, используя мое предыдущее предложение ;p

<?php
session_start();
echo '<h2>ONLINE QUIZ</h2>';


//Scores
if($_SERVER['REQUEST_METHOD']=='GET' && isset($_GET['scores'])){
    echo 'Basic output for scores';
    echo '<pre>';
    print_r($_SESSION['answers']);
    echo '</pre>';
    unset($_SESSION['answers']);
    unset($_SESSION['question']);
}


//Session question/array is set
if(isset($_SESSION['question']) && isset($_SESSION['questions_array'])){

    //Handle prev question post
    if($_SERVER['REQUEST_METHOD']=='POST'){
        //process prev question
        $_SESSION['answers'][$_SESSION['question']-1]=(0+$_POST['answer']);
    }

    if($_SESSION['question'] < $_SESSION['total_question']){
        $q=$_SESSION['question'];
        //EDIT - Shuffle answers for output
        //Hold the question into a var
        $question = $_SESSION['questions_array'][$q][0];
        //unset the question from the array
        unset($_SESSION['questions_array'][$q][0]);
        //put all the pos answers into a new array
        $answers = $_SESSION['questions_array'][$q];
        //shuffle the answers
        shuffle($answers);


        echo '<form method="POST" action="">
              <h3>'.$question.'</h3>';
        //loop through the answers
        foreach($answers as $key=>$value){
            //if the value is nothing cont to next, removed question key 0
            if($value==''){continue;}else{
                echo '<p><input type="radio" value="'.$value.'" name="answer">'.$value.'</p>';
            }
        }
        echo '<p><input type="submit" value="Submit"></p>
        </form>';

    }else{
        //Quiz Complete
        echo 'Test Complete <a href="'.basename($_SERVER["SCRIPT_FILENAME"]).'?scores=1">Check scores</a>';
    }

    //Assign next question to session
    $_SESSION['question']++;
}else{

    //Pages first load so show quiz index
    $_SESSION['question']=0;
    get_questions();
?>
    <ul>
        <li><a href='<?=basename($_SERVER["SCRIPT_FILENAME"]);?>'>Take quiz</a></li>
        <li><a href='module.php'>Admin Module</a></li>
    </ul>
    <?php
}

//Function to put questions in session
function get_questions(){
    $file = fopen('data.txt', 'r');
    $array = array();
    while ($line = fgetcsv($file,1000,',')) {
        $array[] = $line;
    }
    fclose($file);
    $_SESSION['questions_array']=$array;
    $_SESSION['total_question']=count($array);
    return;
}
?>
person Lawrence Cherone    schedule 19.04.2012
comment
Большое спасибо! Я попробую этот - person user1344705; 20.04.2012
comment
Он будет публиковать сам, вот в чем идея, примечание: <?=basename($_SERVER["SCRIPT_FILENAME"]);?> - person Lawrence Cherone; 20.04.2012
comment
Эй, я попробовал это и не получил никаких ошибок, однако он просто отображает пустую страницу. Я сейчас пытаюсь найти, что могло быть причиной этого. Вы случайно не представляете? - person user1344705; 20.04.2012
comment
возможно, $_SESSION['question'] больше, чем количество оставшихся вопросов, и попадает в часть Quiz Complete, которая не имеет вывода, это только базовая базовая структура, которую вам еще нужно построить. - person Lawrence Cherone; 20.04.2012
comment
Да, мне нравится это решение. Чисто. Гораздо прочнее. +1 - person Matt Moore; 20.04.2012
comment
@user1344705 user1344705 Я обновил свой ответ до рабочей версии, причина, по которой он был пустым, заключалась в отсутствии разделителя в функции fgetcsv. - person Lawrence Cherone; 20.04.2012
comment
@LawrenceCherone Большое спасибо за ваше время! Мне нужна кнопка отправки, чтобы привести меня на временную страницу результатов, где пользователю нужно щелкнуть ссылку «продолжить», чтобы увидеть следующий вопрос, но это очень, очень полезно! +1 - person user1344705; 20.04.2012
comment
@LawrenceCherone Здравствуйте, извините за беспокойство, но мне просто интересно, есть ли какой-нибудь возможный способ перетасовать / отсортировать «ответы», не затрагивая их значения индекса в этом коде? - person user1344705; 22.04.2012
comment
да, прямо перед тем, как установить сеанс в функции get_questions, сделайте fclose($file); shuffle($array); - person Lawrence Cherone; 22.04.2012
comment
@LawrenceCherone Я пробовал это, но вопросы и ответы перемешиваются. Я только хочу, чтобы ответы (переключатели) были отсортированы так, чтобы правильный ответ не всегда был вверху (поскольку я так установил). Вы случайно не знаете, как я могу это сделать? - person user1344705; 22.04.2012
comment
хорошо, я обновил свой ответ, включив в него возможную перетасовку ответов (чтобы многое объяснить), поскольку все становится сложнее, может быть проще создать базу данных для хранения вещей ... надеюсь, это поможет - person Lawrence Cherone; 22.04.2012

Итак, решение вашей проблемы - сделать еще один сдвиг массива во внешнем массиве. Таким образом, вы можете снять один вопрос и распечатать его. Тест сохраняется в сеансе, поэтому при следующей загрузке страницы (т. е. при нажатии кнопки «Продолжить») будет выбран следующий вопрос.

Страница вопросов:

<?php

session_start();
if(sizeof($_SESSION['questions_array']) > 0 )
{
    // Get the next question off of the Quiz in our SESSION
    $data = array_shift($_SESSION["questions_array"]);

    echo '<p>'.array_shift($data).'</p>'; // pop the question

    //list out the possible answers
    foreach ($data as $a => $answer) 
    {
        echo 
               '  <input type="radio" name="question-'.$q.'" id="question-'.$q.'"'.
               '         value="'.$a.'"/>'.
               '  <label for="question-'.$q.'">'.$answer.'</label>'.
               '<br>';

    }

}
else
{
  //questions array is empty, show quiz complete page
}

?>

Теперь ваша страница вопросов возвращает только один вопрос. При нажатии кнопки «Отправить» они переходят на страницу ответов. Когда нажимается «Продолжить», они возвращаются. Тогда наша система делает следующее: 1) Остались ли вопросы в нашем массиве? A) Да A.1) Хорошо, вставьте следующий вопрос с помощью array_shift($_SESSION['questions_array']) A.2) Вставьте вопрос, затем перечислите ответы. Б) Нет Б.1) Больше вопросов нет, наша викторина окончена.

Примечание: есть некоторые недостатки. Если человек обновляет страницу, он получает новый вопрос, а другой остается без ответа. В качестве альтернативы вы можете передать переменную $counter, которая обновляется каждый раз при загрузке страницы ответов. Затем передайте этот счетчик в массив $_SESSION, чтобы вернуть следующий вопрос. Тебе решать.

person Matt Moore    schedule 19.04.2012
comment
Да... эта блок-схема выглядела намного лучше, когда она не была собрана воедино. - person Matt Moore; 20.04.2012
comment
Спасибо за помощь! Потребуется ли для этого кода новая страница или я могу добавить ее на свою страницу вопросов? -- Я попытался добавить его на свою страницу вопросов, и на странице по-прежнему отображались все вопросы :( - person user1344705; 20.04.2012
comment
Ты заменил то, что было? Я говорю, используйте это вместо того, что вы указали в своем вопросе. Новая страница не нужна. Поместите это на страницу вопросов вместо того, что у вас было. - person Matt Moore; 20.04.2012
comment
Это сработало! Большое спасибо =] Я буду иметь в виду и минусы! - person user1344705; 20.04.2012