2016-09-16 41 views
0

我試圖檢查用戶是否在之前參加過測驗,如果他/她有,我希望他們不能再次參加測驗。我通過使用cookie來實現代碼,出於某種原因,我的代碼拒絕停止用戶再次參加測驗。我一直盯着這個很長一段時間,所以幫助會很好!Cookie可以重置的原因?

注:$ _SESSION [「指數」]從先前頁設置爲0最初和$ _COOKIE ['quizTakers「]是最初爲空數組的每個問題來一次一個

<?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中放入一組用戶名?每個用戶都有自己的Cookie。所以無論是爲他們設置cookie還是不設置,都不會包含其他用戶。 – Barmar

回答

0

在cookie被設置之前,$_COOKIE['quizTakers']不存在,並且當您在此調用unserialize()時,您將$addUsers設置爲false。然後當您嘗試執行array_push($addUser, $userN);時,由於$addUser不是數組,因此失敗,因此$addUser仍然是false。然後你把它放入cookie中。

用戶下次運行腳本時,您會從Cookie中讀取false,並且在此中找不到用戶名,因此您不會停止用戶再次參加測驗。

你正在使這個要比它需要的複雜得多。您不需要將數組放入Cookie中,因爲Cookie不會被所有用戶共享。只需將一個cookie設置爲一個簡單的字符串並測試cookie是否已設置。

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); 

正如其他人指出的,用戶可以通過清除cookie來解決此問題。所以如果你需要更安全的東西,你需要實現一個登錄系統,並使用數據庫或文件來跟蹤哪些用戶已經參加了測驗。

+0

謝謝,我會接受你的建議 –

0

我還沒有看過你的代碼,但是你是否已經明確地理解了cookie /會話的概念?

cookie會在瀏覽器中存儲數據,並在每次請求網站時發送數據。服務器但是將存儲客戶端的cookie以在隨後的請求中標識用戶。

因此,用戶可以簡單地擦除cookie(在這兩種情況下)並且服務器不知道該用戶曾參加過測驗。

什麼,你可以嘗試的IP地址和瀏覽器度量的組合,但要注意的是IP不會忽略可以改變(非常快))

0

餅乾可以由用戶將丟失,你不會不知道,如果他們不是你的測驗。

如果您想要永久性地知道他們是否完成了他們,您可能需要強制他人註冊才能獲得測驗,因爲可以輕鬆地擦除Cookie。

相關問題