PHP unserialize()偏移时出错

时间:2013-06-27 16:27:34

标签: php serialization encoding character-encoding fuelphp

我得到的确切错误是:

ErrorException [注意]:unserialize():错误5偏移量为59个字节

从MySQL中的TEXT字段返回的序列化数据是(编码:utf8,引擎:InnoDB):

a:1:{s:12:"display_name";s:6:"Foo";}

反序列化输出后:

array(1) { [0]=> bool(false) }

我期待这样的事情:

array(1) { ["display_name"]=> string(6) "Foo" }

我在Mac OS 10.8.4上使用FuelPHP 1.6.1,PHP 5.4.10,MySQL 5.5.29,InnoDB 1.1.8。一些序列化的条目工作在反序列化,而其他条件不工作,如果我复制一个工作并粘贴到一个不显示相同的错误。我相信它是一个字符问题,我试图编码为utf8,urlencode和stripslashes,但似乎没有任何效果。

感谢任何帮助!

更新

序列化的字符串有一个类型,我在这里粘贴它以保护实际显示名称的隐私。这是实际的字符串:

a:1:{s:12:"display_name";s:3:"Foo";}

感谢@robw指出这一点。

更新&答案

我现在通过html_entity_decode()运行序列化数据:

$unserialized = unserialize(html_entity_decode($serialized, ENT_QUOTES));

感谢您的帮助和建议!

1 个答案:

答案 0 :(得分:2)

您的问题出在此处:s:6:"Foo"

Foo长度不是6个字符...因此永远不会按预期进行解析。

尝试:s:3:"Foo"

PS:这看起来像你在MySQL中编辑数据,然后当你的应用程序试图解析它时,它会出错。除非您100%确定已根据TYPE和VALUE修改了LENGTH,否则不应编辑数据库中的序列化值。