2

以前にテキストファイルを作成し、それを多次元配列に変換して、クイズの質問として表示しました。

注:画像を挿入できないため、例を示すことができないため、できる限り説明的になるように努めます。

ユーザーがクイズをクリックするたびに、一度に1つの質問だけを表示しようとしています。

これはこれまでの私のコードです。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と、ユーザーは質問ページに移動し、質問が1つだけ表示されます。次に、ユーザーは回答を選択してヒットし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()を使用して1つの質問のみを表示するにはどうすればよいですか?

4

2 に答える 2

2

私はあなたの質問をちょっと理解しました、私は基本的な構造を書き留めました。これはすべて1ページで実行できます。お役に立てば幸いです。

編集:

私のような素敵な人は、私の前の提案を使用して、完全なスクリプトをここに示します; 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;
}
?>
于 2012-04-19T20:44:09.467 に答える
1

さて、あなたの問題の解決策は、外側の配列で別の配列シフトを行うことです。これにより、1つの質問を引き出して印刷することができます。クイズはセッションで保持されるため、次にページが読み込まれると(つまり、続行ボタンがクリックされると)、次の質問が実行されます。

質問ページ:

<?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つの質問しか表示されません。[送信]をクリックすると、回答ページに移動します。[続行]をクリックすると、元に戻ります。次に、システムは次のように動作します。1)アレイに質問が残っていますか?A)はいA.1)array_shift($ _ SESSION ['questions_array'])で次の質問をポップします。A.2)質問をポップして、回答をリストします。B)いいえB.1)これ以上の質問はありません。クイズは終了しました。

注:いくつかの欠点があります。その人がページを更新すると、新しい質問が表示され、もう一方の質問には回答がありません。または、回答ページが読み込まれるたびに更新される$counter変数を渡すこともできます。次に、そのカウンターを$ _SESSION配列に渡して、次の質問に戻します。それはあなた次第です。

于 2012-04-19T21:00:38.257 に答える