在前后端分离开发中,前端通常会以 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(),我们可以快速找出前端传入的非法字段,或未在映射表中定义的字段。这不仅能防止非法数据注入,还能简化字段校验逻辑。建议将其封装为通用的表单校验工具方法,以提高项目的可维护性与安全性。