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

