在前後端分離開發中,前端通常會以JSON 格式向後端提交數據。為了確保數據的完整性和安全性,後端需要驗證這些字段是否與預期字段相符。 PHP 中的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"是非法字段。
<?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() ,我們可以快速找出前端傳入的非法字段,或未在映射表中定義的字段。這不僅能防止非法數據注入,還能簡化字段校驗邏輯。建議將其封裝為通用的表單校驗工具方法,以提高項目的可維護性與安全性。