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

PHP filter_has_var 函數:檢查輸入變數是否存在

     編輯:PHP 相關知識

filter_has_var:區分「變數不存在」與「值為空」的關鍵函數

在處理表單提交時,isset() 和 empty() 常因處理超全域變數行為差異導致誤判。filter_has_var() 專門檢查指定輸入來源中是否存在變數,不受值內容影響,是精確驗證參數完整性的標準工具。

函數語法

filter_has_var(int $type, string $variable): bool

輸入來源類型($type)

常數 來源
INPUT_GET查詢字串參數
INPUT_POSTPOST 表單資料
INPUT_COOKIECookie 值
INPUT_SERVER伺服器變數
INPUT_ENV環境變數

注意:INPUT_SESSION、INPUT_REQUEST 尚未實作。

回傳值

  • true:變數存在於指定來源(即使值為空字串)
  • false:變數不存在於該來源

核心差異:filter_has_var vs isset vs empty

情境 filter_has_var(INPUT_POST, 'x') isset($_POST['x']) empty($_POST['x'])
未送欄位falsefalsetrue
送欄位但值為空truetruetrue
送欄位值為 "0"truetruetrue
送欄位值為 "test"truetruefalse

實戰範例

範例 1:檢查必要參數

<?php
// API 端點:要求必須提供 user_id
if (!filter_has_var(INPUT_GET, 'user_id')) {
    http_response_code(400);
    echo json_encode(['error' => '缺少必要參數 user_id']);
    exit;
}

$userId = filter_input(INPUT_GET, 'user_id', FILTER_VALIDATE_INT);
if ($userId === false) {
    http_response_code(400);
    echo json_encode(['error' => 'user_id 必須為整數']);
    exit;
}

echo "處理用戶 ID:$userId";
?>

範例 2:區分「未提供」與「明確設為空」

<?php
// 更新用戶資料:選填欄位
$updates = [];

// nickname:若有送才更新(即使為空字串表示清除)
if (filter_has_var(INPUT_POST, 'nickname')) {
    $updates['nickname'] = filter_input(INPUT_POST, 'nickname', FILTER_SANITIZE_STRING);
}

// bio:未送則不更新
if (filter_has_var(INPUT_POST, 'bio')) {
    $updates['bio'] = filter_input(INPUT_POST, 'bio', FILTER_SANITIZE_STRING);
}

// 執行更新...
?>

範例 3:檢查檔案上傳欄位

<?php
// $_FILES 不支援 filter_has_var,需用 isset
if (isset($_FILES['avatar']) && $_FILES['avatar']['error'] === UPLOAD_ERR_OK) {
    // 處理上傳
}
?>

進階應用:建立參數驗證器

<?php
class InputValidator {
    private array $required = [];
    private array $optional = [];
    
    public function require(string $field, int $source = INPUT_POST): self {
        $this->required[$field] = $source;
        return $this;
    }
    
    public function optional(string $field, int $source = INPUT_POST): self {
        $this->optional[$field] = $source;
        return $this;
    }
    
    public function validate(): array {
        $missing = [];
        foreach ($this->required as $field => $source) {
            if (!filter_has_var($source, $field)) {
                $missing[] = $field;
            }
        }
        if ($missing) {
            throw new Exception("缺少必要參數:" . implode(', ', $missing));
        }
        return array_merge($this->required, $this->optional);
    }
}

// 使用方式
$validator = new InputValidator();
$validator->require('email')->require('password')->optional('remember_me');
$fields = $validator->validate();
?>

常見誤區與注意事項

  • ❌ 以為能檢查 $_FILES(需用 isset($_FILES['key']))
  • ❌ 以為能檢查 $_SESSION/$_REQUEST(尚未實作)
  • ❌ 與 filter_input 混淆:has_var 只查存在性,input 才取值並過濾
  • ✅ 搭配使用:先 has_var 確認存在,再 filter_input 取值驗證

最佳實務

  1. API 入口統一用 filter_has_var 驗證必要參數
  2. 表單處理區分「必填」與「選填(可為空)」
  3. 建立驗證中介層,集中處理參數檢查邏輯
  4. 回傳結構化錯誤(欄位、代碼、訊息),方便前端顯示

filter_has_var 雖然簡單,但能解決「參數是否真正被送來」這個基本又關鍵的問題,是建立健壯輸入處理流程的基石。

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