在PHP项目开发过程中,前端通过HTML表单提交数据是很常见的操作,但普通的表单字段只能传递字符串、数字这类简单数据,如果要传递多维数组、关联数组等复杂结构的数据,直接赋值给表单字段会出现数据丢失或格式异常的问题。下面介绍两种可靠的实现方式。

方式一:使用serialize和unserialize函数
serialize函数可以把PHP的任意数据类型转换为可存储的字符串,unserialize函数则可以把这个字符串还原为原来的数据类型,非常适合处理复杂数组的传递。
前端表单代码
我们可以把需要传递的复杂数组先序列化,然后放到隐藏字段中提交。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>表单传递复杂数组</title>
</head>
<body>
<?php
// 定义要传递的复杂数组
$complex_array = [
'user_info' => [
'name' => '张三',
'age' => 25,
'hobbies' => ['篮球', '阅读', '编程']
],
'order_list' => [
['id' => 1, 'product' => '手机', 'price' => 3999],
['id' => 2, 'product' => '耳机', 'price' => 699]
]
];
// 序列化数组并编码,避免特殊字符影响表单提交
$serialized_data = htmlspecialchars(serialize($complex_array));
?>
<form action="handle.php" method="post">
<input type="hidden" name="array_data" value="<?php echo $serialized_data; ?>">
<input type="submit" value="提交数据">
</form>
</body>
</html>后端处理代码
后端接收到序列化字符串后,需要先校验数据合法性,再进行反序列化操作,避免恶意数据注入。
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 检查是否接收到数组数据
if (!isset($_POST['array_data'])) {
die('未接收到有效数据');
}
$raw_data = $_POST['array_data'];
// 解码之前编码的特殊字符
$decoded_data = htmlspecialchars_decode($raw_data);
// 校验序列化字符串的合法性,避免反序列化恶意数据
if (preg_match('/^[aOs]:/', $decoded_data)) {
// 安全反序列化,设置允许的类,避免对象注入
$restored_array = unserialize($decoded_data, ['allowed_classes' => false]);
if ($restored_array !== false) {
echo '恢复后的数组数据:<br>';
print_r($restored_array);
} else {
echo '反序列化失败,数据格式错误';
}
} else {
echo '接收到的数据不符合序列化格式';
}
}
?>方式二:拆分数组为表单字段传递
如果不想使用序列化函数,也可以把复杂数组拆分成符合表单命名规则的字段,提交后后端再重新组装成数组。
前端表单代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>拆分数组传递</title>
</head>
<body>
<form action="handle2.php" method="post">
<!-- 关联数组字段 -->
<input type="hidden" name="data[user_info][name]" value="李四">
<input type="hidden" name="data[user_info][age]" value="30">
<!-- 索引数组字段 -->
<input type="hidden" name="data[user_info][hobbies][]" value="游泳">
<input type="hidden" name="data[user_info][hobbies][]" value="跑步">
<!-- 二维数组字段 -->
<input type="hidden" name="data[order_list][0][id]" value="3">
<input type="hidden" name="data[order_list][0][product]" value="平板">
<input type="hidden" name="data[order_list][0][price]" value="2999">
<input type="hidden" name="data[order_list][1][id]" value="4">
<input type="hidden" name="data[order_list][1][product]" value="键盘">
<input type="hidden" name="data[order_list][1][price]" value="399">
<input type="submit" value="提交拆分数据">
</form>
</body>
</html>后端处理代码
PHP会自动把符合命名规则的表单字段组装成对应的数组,不需要额外处理。
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (isset($_POST['data'])) {
$restored_array = $_POST['data'];
// 对接收到的数据进行过滤,避免恶意输入
array_walk_recursive($restored_array, function(&$value) {
$value = htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
});
echo '恢复后的数组数据:<br>';
print_r($restored_array);
} else {
echo '未接收到有效数据';
}
}
?>安全注意事项
- 使用serialize方式时,一定要对序列化字符串做合法性校验,禁止直接对用户提交的数据调用unserialize,否则可能导致对象注入漏洞。
- 所有接收到的表单数据都要做过滤和转义处理,避免XSS攻击和SQL注入风险。
- 如果传递的数组包含敏感信息,建议对序列化后的字符串做加密处理,避免数据在传输过程中被窃取篡改。
- 拆分数组方式传递时,要注意表单字段的命名规则,避免字段名冲突导致数据覆盖。
PHPHTML_formarray_serializearray_unserializeform_data修改时间:2026-06-06 06:12:39