【问题标题】:PHP unserialize problemPHP反序列化问题
【发布时间】:2009-02-13 14:35:20
【问题描述】:

为什么反序列化不恢复我的数组?请参阅下面的代码..

// 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 中 2797 个字节的偏移量 6 处出错

这是什么意思?

【问题讨论】:

  • 你的问题拯救了我的一天!

标签: php serialization


【解决方案1】:

$item['response'] 之前或之后是否可能包含一些空格?

检查 strlen($item['response']) 给你 61。

编辑:它似乎在末尾使用空格,但开头的空格会使其无法反序列化。

编辑:该错误消息意味着您有很多空白(几乎 2kb),或者 $item['response']echounserialize 之间发生变化

【讨论】:

  • 我尝试了像 unserialize(trim($item['response'])) 这样的修剪。修剪应该已经删除了空格吧?
  • 是的。你说的字符串是 echo'd 是 61 个字节,但是 PHP 说你正在尝试反序列化 2797 个字节,所以发生了一些事情......
【解决方案2】:

对我来说很好用。你确定$item['response'] 是一个字符串吗?是的,似乎是前导空格。

并且在您的开发服务器上,php 永远不应该给您“什么”。它应该配置为产生所有错误、警告和通知。您也可以使用http://php.net/var_dump 代替 print_r,因为它可以为您提供更多信息。

【讨论】:

  • 如果反序列化的参数不是字符串,会显示警告。
【解决方案3】:

这就是我遇到这个问题的原因以及我是如何解决的:

我在输入中存储了一个数组,类似于:

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代码,并用原始字符替换回来。

【讨论】:

    【解决方案4】:

    如果您尝试将序列化数组放入 textarea 中,并最终通过 Ajax 将其传递到其他地方,您可能会遇到特殊字符(例如将转换为“&”的与号 (&) 等问题) ,这足以让您的“序列化”数组不恢复。

    我发现 rawurlencode 和 rawurldecode 的使用非常有助于使我的序列化变得无懈可击,无论它是如何在我的脚本中进行的;

    $myArray = array("Bugs Bunny", "Tom & Jerry");
    
    $serialized = rawurlencode(serialize($myArray));
    
    $myUnserializedArray = rawurldecode(unserialize($serialized));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-28
      • 2013-12-25
      • 1970-01-01
      • 1970-01-01
      • 2011-08-01
      相关资源
      最近更新 更多