【问题标题】:PHP unserialize keeps throwing same error over 100 timesPHP反序列化不断抛出相同的错误超过100次
【发布时间】:2008-09-23 05:06:21
【问题描述】:

我有一个大型二维数组,我对其进行序列化和 base64_encode 并放入数据库。在另一个页面上,我将数组拉出,当我base64_decode 序列化数组时,我可以将其回显出来,它看起来确实有效。

但是,如果我尝试unserialize(base64_decode($serializedArray)),它只会抛出相同的错误,导致 Firefox 几乎崩溃。

错误是:

警告:unserialize() [function.unserialize]:第 24 行的 /var/www/dev/wc_paul/inc/analyzerTester.php 中不再存在节点

我会包含我回显的整个序列化数组,但上次我在这个表单上尝试它时,我的 Firefox 崩溃了。

有人知道为什么会发生这种情况吗?

【问题讨论】:

  • 即使我从来没有把它放在 sql 中,只是去 unserialize(serialize($array));我得到了同样的错误。
  • 我确定这是一个数组。但是,它最初是来自另一台服务器的 xml 响应,然后我从中提取值来构建数组。如果它不能被序列化,我可以接受我猜....但是我应该如何保存它呢?

标签: php mysql serialization


【解决方案1】:

你确定你只是序列化一个数组,而不是一个对象(例如 DOMNode?) 就像资源一样,并不是所有的类都会对反序列化感到满意。作为 DOM 的示例(您的错误向我表明您正在使用它),每个节点都有对 parentNode 的引用,如果在节点被反序列化时 parentNode 不存在,它不能重新创建该引用并随之出现问题。

我建议将 dom 树以 XML 格式保存到数据库中,稍后再加载。

【讨论】:

  • 事实上,快速谷歌搜索错误会出现几个页面,其中 SimpleXML 被序列化,而反序列化出现错误。
【解决方案2】:

确保数据库字段足够大以容纳序列化数组。序列化数据在 PHP 中非常空间效率低下,许多 DB(如 MySQL)会默默地截断太长的字段值。

【讨论】:

  • 这也是我的想法。此外,base64 并不能真正帮助缩小数据。 (真的需要这种编码吗?是不是不能像现在这样存储数据?)
【解决方案3】:

您的数组中有哪些类型的元素?序列化/反序列化不适用于内置 PHP 对象,这通常是导致该错误的原因。

另外,根据您的评论,这不是您的问题,但为了节省数据库空间,不要对数据进行 base64 编码,只需转义即可。即对于 mysql 使用 mysql_real_escape_string。

【讨论】:

    【解决方案4】:

    确保你不序列化资源,它们不能被序列化。

    Resources@php.net

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-19
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多