PHP unserialize продолжает выдавать одну и ту же ошибку более 100 раз
-
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.
Убедитесь, что вы не сериализуете ресурсы, они не могут быть сериализованы.