首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

PHP 猜數字遊戲:修復表單提交後計數器歸零的 Bug

     編輯:程式設計綜合問答

問題現象

初學者寫的猜數字遊戲中,$num_tries(嘗試次數)每次提交表單都會重置為 1,無法正常累加。

錯誤代碼分析

$num_tries = (isset($_POST['num_tries'])) ? $num_tries + 1 : 1;

邏輯錯誤:isset($_POST['num_tries']) 判斷的是「隱藏域是否存在」,但真正的值在 $_POST['num_tries'] 中。代碼卻用了未定義的變量 $num_tries 進行 +1,導致 PHP 拋出 Notice 並當作 0 處理,結果永遠是 1。

正確寫法

$num_tries = isset($_POST['num_tries']) ? (int)$_POST['num_tries'] + 1 : 1;

或更穩健:

$num_tries = empty($_POST['num_tries']) ? 1 : (int)$_POST['num_tries'] + 1;

完善後的核心邏輯

<?php
$number_to_guess = 42;
$num_tries = empty($_POST['num_tries']) ? 1 : (int)$_POST['num_tries'] + 1;

if (!isset($_POST['guess'])) {
    $message = "Welcome to the guessing machine!";
} elseif (!is_numeric($_POST['guess'])) {
    $message = "Not a number!";
} elseif ($_POST['guess'] == $number_to_guess) {
    $message = "Well Done!";
} elseif ($_POST['guess'] > $number_to_guess) {
    $message = $_POST['guess'] . " is too big, try a smaller one!";
} else {
    $message = $_POST['guess'] . " is too small, try a bigger one!";
}
?>
<form method="post">
  <input type="hidden" name="num_tries" value="<?php echo $num_tries; ?>" />
  <input type="text" name="guess" />
  <button type="submit">Guess</button>
</form>
<p>Attempts: <?php echo $num_tries; ?></p>

其他改進建議

  • 使用 filter_input(INPUT_POST, 'guess', FILTER_VALIDATE_INT) 替代 is_numeric,更安全。
  • 將邏輯與視圖分離(MVC 思想),避免 HTML/PHP 混寫難以維護。
  • 加入 CSRF Token 防護表單重放。

總結

核心修復:從 $_POST['num_tries'] 讀取舊值並轉型為 int 後再 +1。初學者易混淆「變量名」與「POST 鍵名」,記住:$_POST['key'] 才是提交上來的值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved