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

unserialize()处理特定序列化数据失效,无法获取预期值'touseef'

排查unserialize()无法正常解析数据的原因

咱们先直接看你给出的序列化字符串问题出在哪:

$serialized_data = 's:170:"a:5:{s:4:"name";s:7:"touseef";s:5:"email";s:21:"touseef1819@yahoo.com";s:7:"contact";s:11:"03425001819";s:4:"city";s:9:"islamabad";s:10:"studylevel";s:12:"Intermediate";}";';

这个字符串是被二次序列化的产物——原本的目标数组(就是里面的a:5:{...}部分)被当成普通字符串又做了一次序列化,所以外层多了s:170:"..."的包裹结构。

为啥会出现只返回'a'的情况?

  • 当你第一次unserialize($serialized_data)时,得到的不是数组,而是里面那个数组的序列化字符串:a:5:{s:4:"name";...}
  • 直接echo这个字符串的话,会输出它的第一个字符a,这就是你看到的结果
  • 之后尝试用$objh['name']取值时,本质是在对字符串用数组索引,这不符合语法,自然拿不到'touseef'

两种解决办法:

办法1:做两次反序列化

既然数据被序列化了两次,那咱们反序列化两次就行:

$serialized_data = 's:170:"a:5:{s:4:"name";s:7:"touseef";s:5:"email";s:21:"touseef1819@yahoo.com";s:7:"contact";s:11:"03425001819";s:4:"city";s:9:"islamabad";s:10:"studylevel";s:12:"Intermediate";}";';
// 第一次反序列化,拿到内层的数组序列化字符串
$inner_str = unserialize($serialized_data);
// 第二次反序列化,得到真正的数组
$objh = unserialize($inner_str);
echo $objh['name']; // 这时候就能输出'touseef'了

办法2:直接修正序列化字符串

把外层多余的s:170:"和末尾的";去掉,直接使用内层的数组序列化内容:

$serialized_data = 'a:5:{s:4:"name";s:7:"touseef";s:5:"email";s:21:"touseef1819@yahoo.com";s:7:"contact";s:11:"03425001819";s:4:"city";s:9:"islamabad";s:10:"studylevel";s:12:"Intermediate";}';
$objh = unserialize($serialized_data);
echo $objh['name']; // 同样能输出'touseef'

额外提醒:

序列化字符串里的长度值(比如s:170里的170)必须和包裹的实际字符串长度完全一致,否则unserialize会失败。你这个案例里的长度是匹配的,所以两种方法都能生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:03:28