PHP unserialize() 偏移处错误

标签 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));

感谢您的帮助和建议!

最佳答案

您的问题在这里:s:6:"Foo"

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

尝试:s:3:"Foo"

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

关于PHP unserialize() 偏移处错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17348448/

相关文章:

php - PHP 中的共享内存文件

php - 如何将数组编码为 JSON?

java - 在java中覆盖类签名

java - Jackson JSON objectmapper 反序列化为 LinkedHashMap 而不是 HashMap

datetime - GWT java.util.Date 序列化错误

java - java中将iso8859-1转换为utf8

php - 从 PHP 创建的 JSON 提供了错误的数据?

php - 通过 WP_Query 中的自定义分类术语值获取 Woocommerce 产品

php - 如何使用 Eclipse PDT(xdebug 和 zend 调试器)调试 PHP 应用程序

python - Perl 6 是否具有与 Python 的 bytearray 方法等效的方法?