You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP序列化数组中@符号的含义及POST数据访问异常问题

问题分析与解决方案

那个@符号是什么?

首先,PHP标准的序列化格式里根本没有@这个符号,你看到的@是序列化字符串损坏的标志——说明你的$_POST数组在PHP自动解析的时候就已经结构异常了,才导致序列化出来的内容乱掉。你贴的序列化内容a:1:@s:13:"{"answer":42";s:0:"";} 明显是格式错误的,正常的PHP数组序列化应该是类似a:1:{s:5:"answer";i:42;} 这样的结构。

为什么会出现这个问题?

核心原因是你JS端发送请求的内容格式和Content-Type不匹配:

  • 你把对象转成了JSON字符串(JSON.stringify(b)),但设置的Content-Type是application/x-www-form-urlencoded(表单编码格式)。
  • 这种情况下,PHP会把整个JSON字符串当成一个没有对应值的表单键来解析,导致$_POST数组变成一个键为不完整JSON片段、值为空字符串的异常数组,所以你调用end()或reset()只能拿到空字符串,序列化出来的内容也乱掉了。

两种解决办法

办法一:用JSON格式发送请求(推荐)

修改JS请求的Content-Type为application/json,PHP端直接读取原始请求体并解析JSON:

JS代码:

let b = {answer: 42};
fetch('/你的PHP端点路径.php', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json', // 关键:设置正确的Content-Type
  },
  body: JSON.stringify(b),
});

PHP代码:

// 读取原始请求体
$rawJson = file_get_contents('php://input');
// 解析为关联数组
$data = json_decode($rawJson, true);

// 现在就能正常访问元素了
echo $data['answer']; // 输出42

办法二:用表单编码格式发送请求

如果坚持要用application/x-www-form-urlencoded,需要把对象转成表单键值对格式,而不是JSON字符串:

JS代码:

let b = {answer: 42};
fetch('/你的PHP端点路径.php', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded',
  },
  // 把对象转成表单键值对字符串
  body: new URLSearchParams(b).toString(),
});

PHP代码:

// 直接从$_POST访问元素
echo $_POST['answer']; // 输出42

内容的提问来源于stack exchange,提问作者arnoldbird

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:18:13