PHP反序列化问题

时间:2009-02-13 14:35:21

标签: php serialization

为什么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字节错误

这是什么意思?

4 个答案:

答案 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));