2016-09-16 12 views
0

私は、ユーザーが以前にクイズを撮ったかどうかを確認しようとしていますが、クイズを再び取ることができないようにしたいと思います。クッキーを使用してこれを行うコードを実装しましたが、何らかの理由で私のコードがユーザーがクイズをやり直すのを拒否します。私は非常に長い時間のためにこれを見つめていたので、助けがよかったです!クッキーがリセットされる理由

注意:$ _SESSION [「インデックスは」]前ページから、最初は0に設定され、$ _COOKIE [ 'quizTakers "]は、最初は空の配列です各質問は、一度に1つに来る

<?php 
     session_start(); 
     #get array of quizTakers from cookie 
     $addUser = unserialize($_COOKIE['quizTakers']); 
     $userN = $_SESSION['username']; 

     #check if user has taken quiz already and make sure you only check once and not after every question submit 
     if(count($addUser) != 0 && intval($_SESSION["index"]) == 0){ 
      foreach ($addUser as $user) { 
       if(strcmp($userN,$user)){ 
        echo "You already took the quiz! <br \>"; 
        echo "<form action=\"changeUser.php\" method=\"post\"> Go Back: <input type=\"submit\"><br \> </form>"; 
        exit(); 
       } 
      } 
      array_push($addUser, $userN); 
      setcookie('quizTakers', serialize($addUser), time()+86400); 
      echo "loop was entered <br />"; 
     } 
     #if array is empty(this is should execute the every first time someone takes the quiz 
     elseif (count($addUser) == 0) { 
      #add user to array if this is first person taking a quiz yo 
      array_push($addUser, $userN); 
      setcookie('quizTakers', serialize($addUser), time()+86400); 
      echo "cookie added line 29 <br/>"; 
     } 

     $indexTemp = intVal($_SESSION["index"]); 

     if(isset($_SESSION["notFirstIndex"])){ 
      #get array of correct answers 
      $correctAns = $_SESSION["correctAnswers"]; 
      #get particular answer at current index 
      $currentCorrectAns = intval($correctAns[$indexTemp]) +1; 


      $userAns = intval($_POST['ans']); 
      echo "The User picked: ".$userAns." and the correct Answer was: ".$currentCorrectAns."<br/>"; 

      if($userAns == intVal($currentCorrectAns)){ 
       echo " you were correct! <br />"; 
       $_SESSION["totalCorrect"] += 1; 
      } 

      else{ 
       echo "you were wrong"; 
       $_SESSION["totalIncorrect"] +=1; 
      } 

     } 
     elseif(!isset($_SESSION['notFirstIndex'])){ 
      echo "Welcome to your quiz, $userN <br />"; 
      echo "You havent answered any questions yet! <br />"; 

     } 

    ?> 
    <!DOCTYPE html> 
    <html> 
    <HR> 
    </html> 

    <?php 


     #When questions are over show results 
     if($_SESSION["numQuestions"] == $indexTemp){ 
      $_SESSION["index"] = 0; 
      echo "Your Results are: <br /> "; 
      echo "Total Questions: ".$_SESSION["numQuestions"]."<br/>"; 
      echo "Total Correct: ".$_SESSION["totalCorrect"]."<br/>"; 
      echo "Total Incorrect: ".$_SESSION["totalIncorrect"]."<br/>"; 
      $percentage = (intval($_SESSION["totalCorrect"])/intval($_SESSION["numQuestions"])) * 100 ; 
      echo "Percentage Rightht: $percentage % <br/ >"; 
      echo "<form action=\"process.php\" method=\"post\"> Back to Main screen: <input type=\"submit\"><br \> </form>"; 

      $takers = unserialize($_COOKIE['quizTakers']); 
      echo $takers[0]; 
      if(count($takers) == 1){ 
       echo "<br />"; 
       echo "You were the first Quiz Taker: <br />"; 
       echo "Total Takers: 1 <br />"; 
       echo "Number Right: ".$_SESSION["totalCorrect"]."<br/>"; 
       echo "Number Incorrect: ".$_SESSION["totalIncorrect"]."<br/>"; 
       echo "Average: $percentage % <br/ >"; 
       exit(); 
      } 

      exit(); 
     } 

     $filename = $_SESSION["quizOfTheDay"]; 

     $quizStuff = file($filename); 
     $ctr =1; 


     $questionInfo = $quizStuff[$indexTemp]; 

     $questionParse = explode("#", $questionInfo); 
     #$_SESSION["correctAns"] = $questionParse[2]; 
     #echo $_SESSION["correctAns"]." from line 56 <br />"; 
     $_SESSION['notFirstIndex'] = "true"; 
     $answerChoices = explode(":",$questionParse[1]); 

     echo "$questionParse[0]? <br />"; 
     ?> 

     <!DOCTYPE html> 
     <html> 
     <form action="questions.php" method="post"> 
      <?php 
       foreach ($answerChoices as $answerChoice) { 
        echo "<input type='radio' name='ans' id='q1' value=".$ctr."> <label for='q1'>".$answerChoice."</label> <br />"; 
        $ctr +=1; 
       } 
       $_SESSION["index"] = $indexTemp +1; 
      ?> 
     <input type="submit" name="submit" value="GO!"> 
     </form> 

     </html> 
+0

なぜあなたはユーザー名の配列をクッキーに入れていますか?各ユーザーには独自のCookieがあります。したがって、クッキーが設定されているか、クッキーが設定されていないかは、決して他のユーザーを含むことはありません。 – Barmar

答えて

0

クッキーを設定する前に、$_COOKIE['quizTakers']は存在しません。unserialize()を呼び出すと、$addUsersfalseに設定されます。その後、array_push($addUser, $userN);を実行しようとすると、$addUserが配列ではないため、これは失敗します。したがって、$addUserはまだfalseです。次に、これをクッキーに入れます。

次回ユーザーがスクリプトを実行すると、クッキーからfalseが読み込まれます。ユーザー名はこれで見つからないので、ユーザーは再びクイズを受け取ることを止めません。

あなたはこれを必要以上に複雑にしています。クッキーはすべてのユーザーによって共有されないため、配列をクッキーに入れる必要はありません。単純な文字列にクッキーを設定し、クッキーが設定されているかどうかをテストするだけです。

if (isset($_COOKIE['took_quiz'])) { 
    echo "You already took the quiz! <br \>"; 
    echo "<form action=\"changeUser.php\" method=\"post\"> Go Back: <input type=\"submit\"><br \> </form>"; 
    exit(); 
} 
setcookie('took_quiz', 'true', time()+86400); 

他の人が指摘しているように、ユーザーはクッキーを消去することでこれを回避することができます。したがって、より安全なものが必要な場合は、ログインシステムを実装し、データベースまたはファイルを使用して、どのユーザーが既にクイズを取得しているかを追跡する必要があります。

+0

ありがとう、私はあなたのアドバイスを取る –

0

私はあなたのコードを読んでいませんが、あなたはクッキー/セッションのコンセプトを知っていましたか?

クッキーはブラウザにデータを保存し、ウェブサイトがリクエストされるたびに送信します。サーバであるが、は、クライアント側のクッキーを保存して、後続の要求でユーザを識別する。

したがって、ユーザーはクッキーをシンプルに消去して(どちらの場合も)、サーバーは知らないため、このユーザーはクイズを受けたことがあります。

は何あなたが試すことができますことは、IPアドレスやブラウザメトリックの組み合わせですが、それはIPの住所が変更できる用心;

0

クッキーは、利用者によって消去することができ、彼らはどうかは知らないだろう)(非常に速いです)あなたのクイズをしましたか?

クッキーが簡単に消去されるため、クエストが完了したかどうかを恒久的に知りたい場合は、登録を強制する必要があります。

関連する問題