为什么unserialize不能恢复我的阵列?请参阅下面的代码..
// prints a:1:{s:8:"txn_type";s:32:"recurring_payment_profile_cancel";}
echo $item['response'];
// prints nothing
print_r(unserialize($item['response']));
我理解为什么print_r($ response)什么都没给我
**编辑 - 我注意到了这个
注意:unserialize()[function.unserialize]:第13行/home/reitinve/public_html/action/doc.php中偏移量为6的2797字节错误
这是什么意思?
答案 0 :(得分:3)
$item['response']
之前或之后是否可能包含一些空格?
检查strlen($item['response'])
给你61。
编辑:它似乎在最后使用空白,但是开头的空格会使它无法反序列化。
编辑:该错误消息表示您有大量空格(几乎2kb),或者$item['response']
和echo
之间正在更改unserialize
答案 1 :(得分:1)
对我来说很好。你确定$item['response']
是一个字符串吗?是的,似乎是领导空白。
在您的开发服务器上,php永远不会给你'没事'。它应配置为生成所有错误,警告和通知。您也可以使用http://php.net/var_dump代替print_r,因为它可以为您提供更多信息。
答案 2 :(得分:0)
这就是为什么我遇到这个问题以及我是如何解决的:
我在我的输入中存储了一个类似于此的数组:
value="<?php echo htmlspecialchars(serialize(array($a, $b))); ?>"
在这里,由于可能的解析错误,我不得不使用htmlspecialchars()
。
然后,当我尝试反序列化时,它给了我Error at offset X of Y bytes in ...
错误。我将未序列化的字符串打印到屏幕上,意识到某些字符的html等价物导致错误。
为了更清楚,双引号html代码%22
导致此错误。所以我用引号字符替换它们并且它起作用了。
unserialize(str_replace('%22', '"', $_POST['serialized']));
因此,最好检查序列化字符串中是否有任何html代码,并将其替换为原始字符。
答案 3 :(得分:0)
如果您尝试将序列化数组放在textarea中,最后通过Ajax将其传递到其他地方,也要小心,您可能会遇到特殊字符的问题,例如Ampersand(&amp;)将被转换为“&amp; amp; amp;“,这足以让你的”序列化“数组不能恢复。
我发现使用rawurlencode和rawurldecode非常有助于我的序列化防弹,无论它如何在我的脚本中传播;
$myArray = array("Bugs Bunny", "Tom & Jerry");
$serialized = rawurlencode(serialize($myArray));
$myUnserializedArray = rawurldecode(unserialize($serialized));