我得到的确切错误是:
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));
感谢您的帮助和建议!
最佳答案
您的问题在这里:s:6:"Foo"
Foo
不是 6 个字符长...因此永远不会按预期解析。
尝试:s:3:"Foo"
PS:这看起来就像您在 MySQL 中编辑了数据,然后当您的应用程序尝试解析它时,它出错了。除非您 100% 确定已根据 TYPE 和 VALUE 修改了 LENGTH,否则切勿编辑数据库中的序列化值。
关于PHP unserialize() 偏移处错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17348448/