<?php
$val = '0'; // 字符串零
var_dump($val == 0); // true 😱
var_dump($val == ''); // false
var_dump($val === 0); // false (類型不同)
var_dump(empty($val)); // false 😱 字符串 '0' 不視為 empty!
var_dump($val == null); // true 😱
var_dump(is_numeric($val)); // true
?>
| 業務語義 | 推薦寫法 | 說明 |
|---|---|---|
| 「未提交/未設置」 | !isset($_POST['key']) | 區分「未傳」與「傳了空值」 |
| 「提交了但為空字符串」 | isset($_POST['key']) && $_POST['key'] === '' | 精確匹配空串 |
| 「提交了非空字符串」 | isset($_POST['key']) && $_POST['key'] !== '' | 最常用驗證 |
| 「數值為 0(含字符串 '0')」 | $val == 0 或 (string)$val === '0' | 業務允許 0 時 |
| 「數值非零」 | $val != 0 或 (string)$val !== '0' | 注意 '0.0' != 0 為 false |
| 「一般性空值檢查」 | empty($val) | 包含:null, '', 0, '0', false, [], 未定義 — 慎用 |
| 「嚴格非空字符串」 | is_string($val) && $val !== '' | 排除數字 0、布爾 false |
<?php
function validateRequired(array $data, array $requiredFields): array {
$errors = [];
foreach ($requiredFields as $field) {
// 1. 檢查是否提交
if (!array_key_exists($field, $data)) {
$errors[$field] = '字段缺失';
continue;
}
$val = $data[$field];
// 2. 字符串類型非空檢查(允許 '0'、'false' 等業務有效值)
if (is_string($val) && $val === '') {
$errors[$field] = '不能為空';
}
// 3. 陣列類型非空(如多選框)
elseif (is_array($val) && empty($val)) {
$errors[$field] = '至少選擇一項';
}
// 4. 數值類型(可選:排除 0)
// elseif (is_numeric($val) && $val == 0) { ... }
}
return $errors;
}
// 使用
$errors = validateRequired($_POST, ['username', 'age', 'hobbies']);
if ($errors) {
// 返回錯誤
}
?>
<?php
// 資料庫 tinyint(1) 狀態:0=禁用, 1=啟用
$status = $_POST['status'] ?? '';
// ✅ 正確:明確允許 '0' 字符串
if ($status === '0' || $status === '1') {
$stmt->execute([$status]);
}
// ❌ 錯誤:empty('0') 為 true,會誤判為未提交
// if (!empty($status)) { ... }
?>
isset/array_key_exists 區分「有無」===/!== 區分「值與類型」empty/==,業務允許 0 時必須顯式處理記住:'0' 在 PHP 中是「非空字符串」但「數值為零」,empty() 視其為空,== 0 視其為零——根據業務語義選擇比較方式,而非習慣。