2012-09-05 4 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? Ваш пример сериализованных данных не работает с unserialize() в самом PHP, и ваш несертифицированный пример недействителен JavaScript, поэтому я не могу его проверить. Было зафиксировано два года назад или около того, чтобы исправить проблему IE, поэтому также убедитесь, что вы используете последний код. –

+0

Извините, но я не знаю, как это поможет. Мои серийные и неэтериализованные примеры не являются действительными, на самом деле это не проблема. Дело в том, что все работает, за исключением IE7, что означает, что в IE7 есть ошибка или нет-функция, которая либо может, либо не может быть обойдена. Я надеялся, что кто-нибудь может сказать мне, что то, что я пытаюсь сделать, выполнимо, в первую очередь, в IE7. В других браузерах он работает нормально. –

+0

Это поможет, потому что мы можем фактически подтвердить и отладить его сами. –

ответ

0

В конце концов, я все понял.

Когда я посмотрел поближе, это не привело к сериализации() после всего, что вызвало ошибку, а скорее unserialize(), которая находится в одном пакете со мной.

В какой-то момент кеш испортился, и по какой-то причине IE9 в режиме comp-mode был единственным браузером тех, кого я тестировал, которые не терпели его. Причиной развращения кеша была укладка utf8_encodes/decodes, которая начала беспорядочную работу.

Это пошло как это:

  • Cache построен и сериализовать с помощью Serialize(). Все ОК.
  • PHP проверяет, действительно ли данные UTF-8 и выполняет utf8_encode соответственно. Сохраняет данные. Все ОК.
  • Загрузка следующей страницы. PHP возвращает сохраненные данные с использованием AJAX. На всякий случай отправляется заголовок UTF-8. данные являются unserialize() d и рассматриваются соответственно. Все ОК.
  • Кэш, возможно, updatet с новым контентом и serialize() 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() как зависимость. –

 Смежные вопросы

  • Нет связанных вопросов^_^