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

PHP 防止空表單提交:empty 與 isset 正確用法

     編輯:PHP 綜合知識

表單提交的空值陷阱

使用者未填寫欄位送出表單時,$_POST['field'] 為空字串 '',而非 null。若欄位為核取方塊且未勾選,則完全不存在於 $_POST 中。

基本防空驗證

<?php
// 處理留言表單
$errors = [];

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // 姓名:必填、非空白
    $name = trim($_POST['name'] ?? '');
    if ($name === '') {
        $errors['name'] = '請輸入姓名';
    }

    // 內容:必填、最小長度
    $comment = trim($_POST['comment'] ?? '');
    if ($comment === '') {
        $errors['comment'] = '請輸入留言內容';
    } elseif (mb_strlen($comment) < 5) {
        $errors['comment'] = '留言至少 5 個字元';
    }

    // 核取方塊:必須勾選
    if (!isset($_POST['agree'])) {
        $errors['agree'] = '請同意條款';
    }

    if (empty($errors)) {
        // 儲存資料庫...
        header('Location: success.php');
        exit;
    }
}

// 顯示表單與錯誤
?>

empty vs isset 關鍵差異

情況isset($v)empty($v)說明
變數不存在falsetrueempty 不報錯
$v = nullfalsetrue
$v = ''truetrue
$v = 0truetrueempty 視 0 為空!
$v = '0'truetrue字串 '0' 也視為空
$v = falsetruetrue
$v = []truetrue

實務最佳策略

<?php
function validateRequired(array $data, array $requiredFields): array {
    $errors = [];
    foreach ($requiredFields as $field => $label) {
        // 1. 檢查是否存在(針對核取方塊/檔案上傳)
        if (!array_key_exists($field, $data)) {
            $errors[$field] = "$label 為必填";
            continue;
        }

        $value = $data[$field];

        // 2. 針對字串類型:trim 後不可為空
        if (is_string($value)) {
            $value = trim($value);
            if ($value === '') {
                $errors[$field] = "$label 不能為空";
            }
        }
        // 3. 針對數值類型:允許 0,但不可為 null/空字串
        elseif (is_numeric($value)) {
            if ($value === '' || $value === null) {
                $errors[$field] = "$label 不能為空";
            }
        }
        // 4. 陣列(多選):至少一個元素
        elseif (is_array($value)) {
            if (empty($value)) {
                $errors[$field] = "請至少選擇一項 $label";
            }
        }
    }
    return $errors;
}

// 使用
$errors = validateRequired($_POST, [
    'name'    => '姓名',
    'email'   => 'Email',
    'age'     => '年齡',      // 允許 0
    'agree'   => '同意條款',  // 核取方塊用 array_key_exists
    'tags'    => '標籤',      // 多選陣列
]);

前端 + 後端雙重驗證

<!-- HTML5 內建驗證 -->
<script> // JS 補強:自訂訊息、即時檢查 document.querySelector('form').addEventListener('submit', e => { const form = e.target; if (!form.checkValidity()) { e.preventDefault(); form.reportValidity(); // 顯示瀏覽器內建提示 } }); </script>

總結

  1. 字串欄位:trim() === '' 最精確
  2. 數值欄位:!is_numeric() || $val === '' 允許 0
  3. 核取方塊/檔案:array_key_exists() 或 isset()
  4. 多選陣列:empty($arr) 正確判斷是否有選項
  5. 永遠後端驗證:前端只為 UX,不可信任
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved