當前位置: 首頁> 最新文章列表> 用array_diff_ukey() 實現前端提交字段和後端字段映射檢查

用array_diff_ukey() 實現前端提交字段和後端字段映射檢查

M66 2025-06-06

在前後端分離開發中,前端通常會以JSON 格式向後端提交數據。為了確保數據的完整性和安全性,後端需要驗證這些字段是否與預期字段相符。 PHP 中的array_diff_ukey()函數可以幫我們優雅地實現這一點。

本文將通過一個簡單的示例,介紹如何使用array_diff_ukey()來比較前端提交的字段和後端允許的字段,從而找出不匹配的鍵名。

一、array_diff_ukey() 簡介

array_diff_ukey()是PHP 內置函數,用於比較兩個數組的鍵名,使用用戶自定義的回調函數進行比較。它返回出現在第一個數組中但不在第二個數組中的鍵名對應的值。

函數原型:

 array_diff_ukey(array $array1, array $array2, callable $key_compare_func): array

二、應用場景:字段映射檢查

假設我們希望後端僅接收以下字段:

 $allowedFields = [
    'username' => true,
    'email' => true,
    'age' => true,
];

前端提交瞭如下數據:

 $submittedData = [
    'username' => 'alice',
    'email' => 'alice@example.com',
    'age' => 25,
    'is_admin' => true, // 非法字段
];

我們需要檢測出"is_admin"是非法字段。

三、使用array_diff_ukey() 檢查非法字段

<?php

$allowedFields = [
    'username' => true,
    'email' => true,
    'age' => true,
];

$submittedData = [
    'username' => 'alice',
    'email' => 'alice@example.com',
    'age' => 25,
    'is_admin' => true,
];

// 使用 array_diff_ukey 進行字段比對
$invalidFields = array_diff_ukey(
    $submittedData,
    $allowedFields,
    function($key1, $key2) {
        return strcmp($key1, $key2);
    }
);

if (!empty($invalidFields)) {
    echo "檢測到非法字段:\n";
    foreach ($invalidFields as $field => $value) {
        echo "- $field: $value\n";
    }

    // 可記錄日誌或返回錯誤信息
    // 示例日誌接口調用(虛擬程式碼):
    $logUrl = 'https://api.m66.net/logs/invalid-fields';
    // sendToApi($logUrl, ['fields' => array_keys($invalidFields)]);
} else {
    echo "字段校驗通過。\n";
}

四、擴展:映射字段名

如果前端字段名與後端不一致(比如駝峰vs 下劃線),可以結合字段映射表使用:

 $fieldMap = [
    'userName' => 'username',
    'emailAddress' => 'email',
    'userAge' => 'age',
];

// 反轉映射表以便驗證
$mappedKeys = array_flip($fieldMap);

// 模擬提交
$submittedData = [
    'userName' => 'alice',
    'emailAddress' => 'alice@example.com',
    'userAge' => 25,
    'adminStatus' => true,
];

$invalidFields = array_diff_ukey(
    $submittedData,
    $mappedKeys,
    'strcmp'
);

if (!empty($invalidFields)) {
    echo "以下字段未在映射表中定義:\n";
    print_r(array_keys($invalidFields));
} else {
    echo "字段映射校驗通過。\n";
}

五、總結

通過array_diff_ukey() ,我們可以快速找出前端傳入的非法字段,或未在映射表中定義的字段。這不僅能防止非法數據注入,還能簡化字段校驗邏輯。建議將其封裝為通用的表單校驗工具方法,以提高項目的可維護性與安全性。