取消初始化偏移量错误,字符串长度似乎太长


Unserialize offset error, string length seems too long

我正试图从数据库查询中取消序列化一个长文本(utf8_unicode_ci),但当我这样做时,我会得到以下错误。

unserialize(): Error at offset 6 of 737 bytes

我猜我的字符串无效,所以我把它输出到浏览器。我注意到字符串长度比实际长度长了一点。当我在浏览器中复制并粘贴输出并将其硬编码到php中时,字符串长度变小了,取消序列化就可以了。

数据库字符串。。。

ASCII - string(737) "a:10:{s:2:"id";i:2234950;s:13:"full_describe";s:11:"Brace start";s:6:"person";s:17:"Dr Aalok Y Shukla";s:8:"datetime";s:25:"2014-01-06T09:00:00+00:00";s:8:"duration";i:30;s:11:"on_waitlist";b:0;s:10:"company_id";s:5:"35927";s:8:"attended";b:1;s:6:"_links";a:2:{s:4:"self";a:1:{s:4:"href";s:60:"http://uk.bookingbug.com/api/v1/admin/35927/bookings/2234950";}s:6:"client";a:1:{s:4:"href";s:57:"http://uk.bookingbug.com/api/v1/admin/35927/client/809828";}}s:11:"appointment";a:1:{s:11:"description";s:11:"Brace start";}}"

将字符串复制并粘贴到php中。。。

ASCII - string(517) "a:10:{s:2:"id";i:2234950;s:13:"full_describe";s:11:"Brace start";s:6:"person";s:17:"Dr Aalok Y Shukla";s:8:"datetime";s:25:"2014-01-06T09:00:00+00:00";s:8:"duration";i:30;s:11:"on_waitlist";b:0;s:10:"company_id";s:5:"35927";s:8:"attended";b:1;s:6:"_links";a:2:{s:4:"self";a:1:{s:4:"href";s:60:"http://uk.bookingbug.com/api/v1/admin/35927/bookings/2234950";}s:6:"client";a:1:{s:4:"href";s:57:"http://uk.bookingbug.com/api/v1/admin/35927/client/809828";}}s:11:"appointment";a:1:{s:11:"description";s:11:"Brace start";}}" 

正如您所看到的,字符串是相同的,但数据库调用中的字符串显示了偏移量错误。

我需要对数据库返回的字符串进行某种解码或格式化吗?

感谢

问题是我正在序列化多维数组,这会导致问题。

在使用serialize之前只修复base64_encode()字符串,在使用unserialize时反之亦然。

//to safely serialize
$safe_string_to_store = base64_encode(serialize($multidimensional_array));
//to unserialize...
$array_restored_from_db = unserialize(base64_decode($encoded_serialized_string));

文章位于http://davidwalsh.name/php-serialize-unserialize-issues

希望这能帮助其他