如何在在线测验中一次只显示一个数据

时间:2012-04-19 20:21:52

标签: php isset

我之前制作了一个文本文件并将其转换为多维数组,以显示我的测验问题。

注意:我无法插入图片,因此我无法提供任何示例,因此我会尝试尽可能具有描述性。

每次用户点击我的测验时,我都会尝试一次只显示一个问题。

到目前为止,这是我的代码。 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()只显示一个问题?

2 个答案:

答案 0 :(得分: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;
}
?>

答案 1 :(得分:1)

好的,所以你的问题的解决方案是在outter数组上做另一个数组移位。通过这个你可以拉出一个问题然后打印出来。测验将保留在会话中,因此下次加载页面时(即单击“继续”按钮),它会提取下一个问题。

问题页面:

<?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)弹出问题,然后列出答案。   b)否     B.1)没有其他问题,我们的测验结束了。

注意:有一些缺点。如果此人刷新页面,他们会得到一个新问题而另一个人没有得到答复。您也可以传递$ counter变量,每次加载答案页面时都会更新。然后将该计数器传递给$ _SESSION数组以返回下一个问题。这取决于你。