【问题标题】:PHP.js unserialize() error IE7PHP.js unserialize() 错误 IE7
【发布时间】:2012-08-30 03:41:55
【问题描述】:

我尝试使用 PHP.js 的序列化包序列化对象数据以通过 php 保存到文件中。

铬:很好 FF:很好 IE9:很好 兼容模式下的 IE9(本质上是 IE7):不好。

来自控制台的错误:

SCRIPT5022: Exception thrown and not caught 
serialize.min.js, line 144 character 55

序列化后的数据基本上是这样的:

a:180:{s:40:"Aleksis Kiven tie 15<br>04200 Kerava<br>";a:2:{i:0;d:60.4012598;i:1;d:25.09659910000005;}

未序列化:

{"Aleksis Kiven tie 15<br>04200 Kerava<br>": [60.4012598, 25.09659910000005]}

处理缓存的 Javascript 如下所示:

function saveCache(data) {
    sdata = serialize(data);
    $.ajax({
        type: 'POST',
        url: 'http://localhost/foobar/files/coordinates.php',
        data: {
            'do': 'write',
            'data': sdata
        }
    });
}

我正在按地址将地理编码结果缓存到文本文件中。

如果我没有道理,请多问。

主要编辑:我更正了所指出的示例。同样重要的是问题确实发生了变化。这实际上不是 serialize() 的问题,而是 unserialize() 的问题。

【问题讨论】:

  • 您有在 PHP 中实际工作的示例吗?您的序列化数据示例不适用于 PHP 本身中的 unserialize() 并且您的未序列化示例不是有效的 JavaScript,因此我无法真正对其进行测试。大约两年前有一个提交来修复 IE 问题,所以还要确保你使用的是最新的代码。
  • 很抱歉,但我不知道它会有什么帮助。我的序列化和非序列化示例无效并不是真正的问题。关键是一切正常,除了 IE7,这意味着 IE7 中存在可以或不能规避的错误或无功能。我希望有人能告诉我,如果我尝试做的事情首先是可行的,那就是在 IE7 中。在其他浏览器中它工作正常。
  • 这会有所帮助,因为我们实际上可以自己确认和调试它。

标签: internet-explorer-7 jsonserializer phpjs


【解决方案1】:

毕竟是我自己想出来的。

当我仔细观察时,并不是 serialize() 导致错误,而是 unserialize() 与我在同一个包中。

在某些时候缓存损坏了,出于某种原因,在我测试过的浏览器中,压缩模式下的 IE9 是唯一一个不能容忍它的浏览器。缓存损坏的原因是堆积 utf8_encodes/decodes 开始搞砸了。

事情是这样的:

  • 使用 serialize() 构建和序列化缓存。一切正常。
  • PHP 检查数据是否真的是 UTF-8 并相应地执行 utf8_encode。保存数据。一切正常。
  • 下一页加载。 PHP 使用 AJAX 返回存储的数据。发送一个 UTF-8 标头以防万一。数据是 unserialize()d 并相应地处理。一切正常。
  • 缓存可能已更新为新内容和serialize()d。警告序列化数据会产生一个惊喜:中文字符和损坏代替 åäö!

解决方案在于 unserialize() 执行 不必要的 utf8_decode()。该页面是 UTF-8。我所有的 javascript 文件都是 UTF-8。缓存数据多次确保为 UTF-8。所以不存在也没有任何理由来解码 UTF-8。我不是 100% 确定 究竟 是如何删除数据的,但是注释掉 utf8_decode 解决了这个问题。

我对现代浏览器的容错能力有点失望。它太高了。不过还好,我想通了。

【讨论】:

  • 是的,你是对的。这已在较早的源代码中被删除(参见 raw.github.com/kvz/phpjs/master/functions/var/unserialize.js ),但该站点的缓存仍未刷新并且具有旧代码。
  • 那么其他东西也必须过时,因为 serialize() 和 unserialize() 都将 utf8_encode() 或 utf8_decode() 列为依赖项。
猜你喜欢
  • 2013-02-02
  • 1970-01-01
  • 2013-06-25
  • 2010-11-17
  • 1970-01-01
  • 2011-11-26
  • 2011-07-03
  • 1970-01-01
  • 2012-06-10
相关资源
最近更新 更多