2016-09-16 2 views
0

나는 사용자가 전에 퀴즈를 탔는지 확인하려고하는데, 그 사람이 퀴즈를 다시 가질 수 없기를 바란다. 쿠키를 사용하여 코드를 구현했으며 코드가 사용자가 퀴즈에 다시 참여하지 못하도록하는 것을 거부합니다. 나는 아주 오랫동안 이것을 꼼짝 않고 바라 보았으므로 도움이 될 것입니다!쿠키를 재설정 할 수있는 이유는 무엇입니까?

참고 :. $ _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

왜 사용자 이름 배열을 쿠키에 넣고 있습니까? 각 사용자는 자신의 쿠키를 가지고 있습니다. 따라서 쿠키가 설정되었거나 설정되지 않은 경우 다른 사용자를 포함하지 않습니다. – 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의 adresses 변경할 수 조심;

0

쿠키는 사용자가 삭제 될 수 있으며 그들이 경우에 당신이 모르는 것) (매우 빠르게) 너의 퀴즈를했는지 아닌지.

쿠키를 쉽게 지울 수 있는지 여부를 영구적으로 알 수 있도록하려면 등록을 강요해야 할 수도 있습니다.

관련 문제