Не работает unserialize, php

Приветствую, и давайте уже сразу с места в карьер? Вы воспользовались функцией serialize, записали полученную строку в БД и после ее считывания, передали полученную строку unserialize, а в ответ bool(false)? Т. е. иначе говоря не работает unserialize. В таком случае мой вам совет попробуйте полученную строку, после функции serialize, закодировать при помощи base64.

Что делать если не работает unserialize?

Скорее всего с вашей строкой созданной функцией serialize, что то произошло, она изменилась. Поэтому стоит задуматься о промежуточных этапах, подумайте что происходит с вашей строкой? В моем случае происходила запись в БД и считывание ее от туда. Для проверки самих функций можно сделать следующее.

unserialize(serialize($var)) == $var

Если после произведенных манипуляций вы получаете равенство, то значит функции работают исправно. Капаем дальше, как правило после функции serialize мы передаем строку на хранение в БД, и вот тут уже нужно использовать base64_encode.

base64_encode

 

Почему не работает unserialize?

Все дело в том что serialize создает подробное описание переменной практически любого типа (подробнее можно прочесть здесь). Я «сериализовал» массив в строку, а в нее записывается всё: типы, длины строк, количество элементов ну и разумеется сами значения. В значении одного из элементов проскочил символ — » (кавычка), а она автоматически экранируется базой данных.

т.е. вместо — », вы получаете \»

Я не стал ковырять почему она не деэкранируется, встречал периодически что эту опцию отключают принудительно чтобы подобных проблем не испытывать, но для меня это не совсем подходит.

А вообще «сериализованные» данные нужно хранить в специальных полях, тип данных BLOB. В описании данной функции об этом указано. Можно сказать сам себе привез проблемы.

Итог на сегодня таков

Статья конечно немного не по теме блога, но в свою защиту хочу написать следующее, когда я искал почему unserialize не работает, то зачастую находил информацию про магические кавычки и про то что их нужно было отключить.

Но такое альтернативное решение, в тоже время простое, мне не попадалось. Поэтому я и решил в тот день что обязательно опубликую эту статью. Если плохо напишу — поправят комментаторы, если хорошо — похвалят!

Ну и при разработке плагина, который предполагает установку в чужую систему, не уместно было вносить такие глобальные изменения как отключение подобных настроек.

Удачного дня, пока!

 

 

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.