PHP unserialize продолжает выдавать одну и ту же ошибку более 100 раз

StackOverflow https://stackoverflow.com/questions/119234

  •  02-07-2019
  •  | 
  •  

Вопрос

У меня есть большой двухмерный массив, который я сериализую, кодирую в base64_encode и добавляю в базу данных.На другой странице я вытаскиваю массив, и когда я base64_decode сериализованный массив я могу повторить, и он определенно выглядит действительным.

Однако, если я попытаюсь unserialize(base64_decode($serializedArray)) он просто выдает ту же ошибку, что почти приводит к сбою Firefox.

Ошибка:

Предупреждение: unserialize() [функция.унсериализация]:Узел больше не существует в /var/www/dev/wc_paul/inc/analyzerTester.php в строке 24.

Я бы включил весь сериализованный массив, который я вывожу, но в прошлый раз, когда я попробовал это в этой форме, мой Firefox разбился.

Кто-нибудь знает, почему это может происходить?

Это было полезно?

Решение

Вы уверены, что просто сериализуете массив, а не объект (например,DOMNode?) Как и ресурсы, не все классы будут довольны десериализацией.В качестве примера с DOM (с которым ваша ошибка подсказывает мне, что вы работаете), каждый узел имеет ссылку на родительский узел, и если родительский узел не существует в момент десериализации узла, он не сможет воссоздайте эту ссылку, и возникнут проблемы.

Я бы предложил сохранить дерево dom в виде XML в базе данных и загрузить его позже.

Другие советы

Убедитесь, что поле базы данных достаточно велико, чтобы вместить сериализованный массив.Сериализованные данные очень неэффективно использовать пространство в PHP, и многие базы данных (например, MySQL) автоматически обрезают слишком длинные значения полей.

Какой тип элементов содержится в вашем массиве?сериализация/десериализация не работает со встроенными объектами PHP, и это обычно является причиной этой ошибки.

Кроме того, судя по вашему комментарию, это не ваша проблема, но для экономии места в вашей базе данных не кодируйте данные в base64, просто избегайте их.то естьдля MySQL используйте mysql_real_escape_string.

Убедитесь, что вы не сериализуете ресурсы, они не могут быть сериализованы.

Ресурсы@php.net

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top