HTML 核取方塊 <input type="checkbox"> 有特殊行為:勾選時才會隨表單提交,未勾選則完全不出現在 $_POST 中。因此驗證邏輯需分兩階段:
isset($_POST['name']) 判斷是否被勾選$_POST['name'] 值是否符合預期<?php
$expectedValue = 'yes';
$subscribed = false;
if (isset($_POST['subscribe'])) {
// 使用者勾選了核取方塊
if ($_POST['subscribe'] === $expectedValue) {
$subscribed = true;
} else {
// 值被竄改(非預期值)
error_log('核取方塊值無效: ' . $_POST['subscribe']);
$subscribed = false;
}
} else {
// 使用者未勾選
$subscribed = false;
}
if ($subscribed) {
echo '驗證通過,訂閱成功';
// 執行訂閱邏輯...
} else {
echo '驗證失敗:請勾選同意條款';
}
<!-- HTML: 多選興趣 -->
<input type="checkbox" name="interests[]" value="tech"> 科技
<input type="checkbox" name="interests[]" value="sports"> 運動
<input type="checkbox" name="interests[]" value="music"> 音樂
<?php
$allowed = ['tech', 'sports', 'music'];
$selected = $_POST['interests'] ?? [];
// 過濾非法值
$valid = array_intersect($selected, $allowed);
if (empty($valid)) {
echo '請至少選擇一項興趣';
} else {
echo '已選擇: ' . implode(', ', $valid);
// 儲存 $valid...
}
=== 避免型別轉換繞過(如 '1' == true)| 錯誤寫法 | 問題 | 正確寫法 |
|---|---|---|
if ($_POST['chk']) | 未勾選時觸發 Undefined index | if (isset($_POST['chk'])) |
if ($_POST['chk'] == 'on') | 瀏覽器預設值為 'on',但可被修改 | 明確指定 value="yes" 並比對 |
empty($_POST['chk']) | 無法區分「未勾選」與「勾選但值為空」 | 先 isset 再驗證值 |