2013-12-16 29 views
0

我想从数据库查询中反序列化一个长文本(utf8_unicode_ci),但是当我这样做时出现以下错误。反序列化偏移量错误,字符串长度似乎太长

unserialize(): Error at offset 6 of 737 bytes 

我猜我的字符串是无效的,所以我输出它到浏览器。我注意到字符串的长度比实际应该长一点。当我在浏览器中复制并粘贴输出并将其硬编码到php中时,sting长度会变为较小的值,而反序列化会起作用。

数据库字符串...

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";}}" 

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

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

感谢

+0

他们是相同的,但有不同的长度。你检查了这个字符串的编码吗(类似mb_detect_encoding)?我认为你应该将第一个字符串转换成与第二个字符串相同的编码。 – klipach

+0

也有你检查是否有任何尾随空格? 'trim()' – bansi

+0

@klipach我已经使用mb_detect_encoding()检查了编码,它们都是ASCII。任何想法为什么这样做? – arbme

回答

2

的问题是,我是序列化导致的问题多维数组。

在使用序列化之前修复base64_encode()字符串,而在使用序列化之前修正字符串,反之亦然。在http://davidwalsh.name/php-serialize-unserialize-issues

希望找到

//to safely serialize 
$safe_string_to_store = base64_encode(serialize($multidimensional_array)); 

//to unserialize... 
$array_restored_from_db = unserialize(base64_decode($encoded_serialized_string)); 

这条帮助别人