簡體   English   中英

無法從會話變量中檢索數據-PHP數字猜測游戲

[英]Can't retrieve data from session variable - PHP Number guessing game

我正在構建一個數字猜謎游戲,需要創建一個會話變量來保存隨機目標數,直到用戶提交正確的猜測為止。 用戶提交正確答案后,我還需要打印嘗試次數。

我設置了會話變量,並使用了隱藏字段來保存計數器。 我不知道在提交猜測時隱藏字段是否適用於bc,我的代碼會打印出check()函數的第一個if語句。

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

    <?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>

您的$guess變量永遠不會設置為POST值(更正:您正在使用數據提取,但我建議您使用它)。 添加“ $”時,您還在更改會話數組鍵的值:

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

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

第一:開發時請勿設置錯誤級別以排除提示! 這樣,您將永遠不會在變量或數組索引名稱中發現拼寫錯誤。 刪除error_reporting(E_ALL & ~E_NOTICE); ,或將其替換為error_reporting(E_ALL);

第二:您使用extract($_REQUEST); -使用該功能會帶來麻煩。 由於“ register_globals”功能,PHP引入了安全漏洞的悠久歷史,該功能引入了全局變量,僅是因為解析了請求數據中的某些key = value對。 刪除該功能花了好幾年。 您正在使用該功能在沒有任何安全預防措施的情況下重新實現它,並且沒有真正的好處。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM