2013-10-13 12 views
0

我正在構建一個猜數字遊戲,並需要創建一個會話變量來保存隨機目標號碼,直到用戶提交正確的猜測。我還需要輸出用戶提交正確答案後的嘗試次數。無法從會話變量檢索數據 - PHP猜數字遊戲

我設置了我的會話變量,並使用隱藏字段來保存計數器。我不知道當我提交猜測時隱藏字段是否工作,我的代碼打印出check()函數的第一條if語句..ALL THE TIME。

我認爲它與會話變量(當然我的代碼)有關,但我無法弄清楚。我已經爲此工作了兩天,並感到沮喪。任何幫助將是驚人的。這裏是我的下面全碼:

<?php session_start() ?> 
    <!DOCTYPE HTML> 
    <html> 
    <head> 
    <title>Number Guessing Game</title> 
    </head> 
    <body> 
     <h1>Guess the number</h1> 
     <p>I'm thinking of a number between 1 and 5. Can you guess what it is?<br> 
     In less than 3 tries?</p> 
     <?php 
     extract($_REQUEST); 
     error_reporting(E_ALL & ~E_NOTICE); 
     // check to see if this is start of game 
     if (filter_has_var(INPUT_POST, "guess")) { 
      check(); 
     } else { 
      setTarget(); 
     } //end if 
     // set targetNum session variable 
     // increment counter by 1 

     function setTarget() { 
      $targetNum = rand(1, 5); 
      $_SESSION["targetNum"] = $targetNum; 
      $counter++; 
     print <<<HERE 
      <form action="" method="post"> 
      <input type = "text" 
        name = "guess"> 
      <input type = "hidden" 
        name = "counter" 
        value = "$counter"> 
      <h2>Target Number: $targetNum</h2> 
      <h3>The counter is at: $counter</h3> 
      <br> 
      <button type = "submit"> 
       SUBMIT GUESS 
      </button> 
      </form> 
    HERE; 
    } 

     function check() { 
      global $counter; 
      print <<<HERE 
      <form action="" method="post"> 
      <input type = "text" 
        name = "guess" 
        value= "$guess"> 
      <input type = "hidden" 
        name = "counter" 
        value = "$counter"> 
      <h2>Target Number: $targetNum</h2> 
      <h3>The counter is at: $counter</h3> 
      <br> 
      <button type = "submit"> 
       SUBMIT GUESS 
      </button> 
      </form> 
    HERE; 
     if ($guess == $_SESSION['$targetNum']) { 
      print "<h3>Awesome. You guessed it in $counter attempt(s)</h3>"; 
      unset($_SESSION["targetNum"]); 
      $count = 0; 
      print "<a href='numberGuessingGame.php'>TRY AGAIN</a>"; 
     } else if ($guess > $_SESSION['$targetNum']) { 
      print "<h3>Too high. Guess again.</h3>"; 
     } else if ($guess < $_SESSION['$targetNum']) { 
      print "<h3>Too low. Guess again.</h3>"; 
     } else { 
      print "I don't know what that is..."; 
     } 
    } 
    ?> 
    </body> 
    </html> 

回答

0

$guess變量從未被設置爲POST值(更正:您正在使用提取,但我建議反對)。當您添加'$'時,您還正在更改會話陣列密鑰的值:

$guess = $_POST['guess']; 
if ($guess == $_SESSION['targetNum']) { 
0

您提出了兩個基本但嚴重的錯誤。

第一:在開發時不要設置錯誤級別以排除通知!這樣你就不會在變量或數組索引名稱中發現拼寫錯誤。刪除error_reporting(E_ALL & ~E_NOTICE);,或將其替換爲error_reporting(E_ALL);

第二:您使用extract($_REQUEST); - 使用該功能是在尋求麻煩。由於「register_globals」功能,PHP具有很長的安全漏洞歷史,因爲僅僅因爲解析了請求數據中的某個鍵=值對,所以引入了全局變量。花費數年時間才能刪除該功能。您正在通過使用該功能而沒有任何安全防範的情況下重新實施它,並且沒有真正的好處。

刪除extract($_REQUEST);函數,並且使用$_REQUEST['varname']而不是$varname來處理來自遠程瀏覽器的所有變量。