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
相关产品推荐
相关产品推荐

