初學者寫的猜數字遊戲中,$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,更安全。核心修復:從 $_POST['num_tries'] 讀取舊值並轉型為 int 後再 +1。初學者易混淆「變量名」與「POST 鍵名」,記住:$_POST['key'] 才是提交上來的值。