2012-09-05 44 views
0

我尝试序列化对象数据,通过PHP使用PHP.js的序列化包保存到文件中。PHP.js unserialize()错误IE7

铬:细 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()。

+0

你有一个实际在PHP中工作的例子吗?你的序列化数据的例子不适用于PHP本身的unserialize(),你的反序列化的例子不是有效的JavaScript,所以我不能真正测试它。两年前有一个提交来解决IE问题,所以也要确保你使用的是最新的代码。 –

+0

我很抱歉,但我不知道它会如何帮助。我的序列化和非序列化的例子不是有效的并不是真正的问题。问题是,除IE7外,一切都能正常工作,这意味着IE7中存在一个缺陷或无功能,可以或不可以规避。我希望有人能告诉我,我试图做的事情是否可行,首先在IE7中是这样。在其他浏览器中,它工作正常。 –

+0

这会有所帮助,因为我们实际上可以自己确认和调试它。 –

回答

0

毕竟我自己想通了。

当我仔细看看它是不是所有导致错误的serialize(),而是unserialize(),它与我在同一个包中。

在某些时候缓存已损坏,并且由于某种原因,comp-mode中的IE9是我测试过的唯一不允许使用的浏览器。缓存损坏的原因是堆叠utf8_encodes /解码开始搞砸了。

它是这样的:

  • 高速缓存是内置使用序列化序列化()。一切都好。
  • PHP检查数据是否真的是UTF-8并相应地执行utf8_encode。保存数据。一切都好。
  • 下一页加载。 PHP使用AJAX返回存储的数据。为防万一,发送UTF-8标头。数据被反序列化()d并据此处理。一切都好。
  • 缓存可能会更新为新内容和序列化()d。提醒序列化数据会产生一个惊喜:中文字符和腐败代替åäö!

解决办法在于反序列化()执行不必要 utf8_decode()。该页面是UTF-8。我所有的JavaScript文件都是UTF-8。缓存的数据多次被确定为UTF-8。所以没有任何理由可以解码UTF-8。我不是100%确定究竟如何这个数据,但注释掉utf8_decode解决了这个问题。

我对现代浏览器的容错有点失望。它太高了。但是,好的,我明白了。

+0

是的,你是对的。这在源代码中已经被删除(请参阅https://raw.github.com/kvz/phpjs/master/functions/var/unserialize.js),但该网站的缓存仍未刷新并且有旧代码。 –

+0

因为serialize()和unserialize()都将utf8_encode()或utf8_decode()列为依赖项,所以其他内容也必须过时。 –