PHP unserialize продолжает выдавать одну и ту же ошибку более 100 раз - PullRequest
0 голосов
/ 23 сентября 2008

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

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

Ошибка:

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

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

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

Ответы [ 4 ]

5 голосов
/ 23 сентября 2008

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

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

3 голосов
/ 23 сентября 2008

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

0 голосов
/ 23 сентября 2008

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

Resources@php.net

0 голосов
/ 23 сентября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...