@semechki
Я не фрилансер, просто пишу код для себя.

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

Здравствуйте!
Почему-то unserialize перестал работать на вот таком массиве
a:3:{i:0;a:2:{s:5:"title";s:12:"Услуги";s:7:"content";s:1094:"На базе стоматологии «ПрезиДент» на Выставочной проводятся экспертные консультации, лечение под наркозом и с седацией, лечение под микроскопом; компьютерная томография и рентгенография, составляется план лечения. Имеется детское отделение.Оказываются услуги по таким направлениям, как терапия, хирургия, ортопедия, профессиональная гигиена, пародонтология. Предоставляются следующие виды услуг лечение кариеса и патологий пародонта, пломбирование зубов композитами, отбеливание эмали по технологии ZOOM 4, вживление имплантов и инсталляция коронок из металлокерамики и диоксид циркония.";}i:1;a:2:{s:5:"title";s:12:"Проезд";s:7:"content";s:966:"До стоматологии «ПрезиДент» на Выставочной можно доехать на метро. Ближайшие остановки «Шелепиха» или "Выставочная". От "Выставочной" необходимо подняться к Экспоцентру повернуть налево и следовать прямо до стоматологии. От метро "Шелепиха" - поднявшись на поверхность, нужно сесть на любой автобус № т54, т66, 4, 69, 152 и проследовать до остановки «Детская больница». Покинув транспорт, надо повернуть на улицу Антонова-Овсеенко и пройти к высотному зданию по адресу ул. 3-я Красногвардейская дом 3 (вход с улицы Антонова-Овсеенко).";}i:2;a:2:{s:5:"title";s:16:"Парковка";s:7:"content";s:281:"Для пациентов есть бесплатная парковка. Въезд с улицы Антонова-Овсеенко. Для въезда на территорию нужно позвонить администратору за 2 минуты до прибытия.";}}

Вроде как всё хорошо, но код
$info = unserialize($row['information']);
print_r($info);

$row['information'] - возвращает то что выше из базы данных.
Возвращает пустоту, я уже сама не знаю что может быть не так, возможно конечно глаз за мылился и не могу найти очевидную ошибку, но прошу вас о помощи
  • Вопрос задан
  • 1375 просмотров
Решения вопроса 1
@semechki Автор вопроса
Я не фрилансер, просто пишу код для себя.
Помогло решение через кодировку входящей строки через base64_encode(serialize($information));
И выводом unserialize(base64_decode($row['information']));
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
@galaxy
serialize, вообще говоря, выдает бинарные данные, если вы его храните в базе в поле VARCHAR/TEXT, то могут быть пролемы (это, кстати, написано в документации).

Вот у вас, например, длина первого элемента content указана как 1094, а на деле строка длины 1085, поэтому unserialize лажается. Вероятно, при сохранении в БД или еще на каком-то этапе были потеряны какие-то символы.
В общем, для начала сохраняйте это в поле типа BLOB
Ответ написан
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
Прогоните вашу строку через https://ru.functions-online.com/unserialize.html, сразу увидите позицию, на которой unserialize() спотыкается. Кстати, в лог файле ошибок HTTP-сервера эта ошибка обязана присутствовать, потому что PHP её должен отправлять в STDERR.

P.S. И поменять на BLOB мало, надо еще и ошибку в serialized-строке убрать.
Ответ написан
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Нотисы включите, ваша строка явно кривая:
Notice: unserialize(): Error at offset 1162 of 2532 bytes
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
<?php
$s = [
    [
        'title' => 'Услуги',
        'content' => 'На базе стоматологии «ПрезиДент» на Выставочной проводятся экспертные консультации, лечение под наркозом и с седацией, лечение под микроскопом; компьютерная томография и рентгенография, составляется план лечения. Имеется детское отделение.Оказываются услуги по таким направлениям, как терапия, хирургия, ортопедия, профессиональная гигиена, пародонтология. Предоставляются следующие виды услуг лечение кариеса и патологий пародонта, пломбирование зубов композитами, отбеливание эмали по технологии ZOOM 4, вживление имплантов и инсталляция коронок из металлокерамики и диоксид циркония.'
    ], [
        'title' => 'Проезд',
        'content' => 'До стоматологии «ПрезиДент» на Выставочной можно доехать на метро. Ближайшие остановки «Шелепиха» или "Выставочная". От "Выставочной" необходимо подняться к Экспоцентру повернуть налево и следовать прямо до стоматологии. От метро "Шелепиха" - поднявшись на поверхность, нужно сесть на любой автобус № т54, т66, 4, 69, 152 и проследовать до остановки «Детская больница». Покинув транспорт, надо повернуть на улицу Антонова-Овсеенко и пройти к высотному зданию по адресу ул. 3-я Красногвардейская дом 3 (вход с улицы Антонова-Овсеенко).' 
    ], [
        'title' => 'Парковка',
        'content' => 'Для пациентов есть бесплатная парковка. Въезд с улицы Антонова-Овсеенко. Для въезда на территорию нужно позвонить администратору за 2 минуты до прибытия.'
    ]
];
$s = serialize($s);
print $s;

Получаем
a:3:{i:0;a:2:{s:5:"title";s:12:"Услуги";s:7:"content";s:1085:"На базе стоматологии «ПрезиДент» на Выставочной проводятся экспертные консультации, лечение под наркозом и с седацией, лечение под микроскопом; компьютерная томография и рентгенография, составляется план лечения. Имеется детское отделение.Оказываются услуги по таким направлениям, как терапия, хирургия, ортопедия, профессиональная гигиена, пародонтология. Предоставляются следующие виды услуг лечение кариеса и патологий пародонта, пломбирование зубов композитами, отбеливание эмали по технологии ZOOM 4, вживление имплантов и инсталляция коронок из металлокерамики и диоксид циркония.";}i:1;a:2:{s:5:"title";s:12:"Проезд";s:7:"content";s:960:"До стоматологии «ПрезиДент» на Выставочной можно доехать на метро. Ближайшие остановки «Шелепиха» или "Выставочная". От "Выставочной" необходимо подняться к Экспоцентру повернуть налево и следовать прямо до стоматологии. От метро "Шелепиха" - поднявшись на поверхность, нужно сесть на любой автобус № т54, т66, 4, 69, 152 и проследовать до остановки «Детская больница». Покинув транспорт, надо повернуть на улицу Антонова-Овсеенко и пройти к высотному зданию по адресу ул. 3-я Красногвардейская дом 3 (вход с улицы Антонова-Овсеенко).";}i:2;a:2:{s:5:"title";s:16:"Парковка";s:7:"content";s:281:"Для пациентов есть бесплатная парковка. Въезд с улицы Антонова-Овсеенко. Для въезда на территорию нужно позвонить администратору за 2 минуты до прибытия.";}}

Если сравнить с вашей строкой, то разница только в заявленных длинах строк 1085 байт вместо 1094 и 960 вместо 966. Непонятно, куда и какие делись символы из оригинального текста, сравнивайте побайтно оригинальную строку и строку с ошибкой unserialize.
А в целом, IMHO, для хранения в базе данных лучше использовать JSON в кодировке utf8mb4, а если с этими данными надо ещё и активно работать, то выносить их в отдельную таблицу свойств.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы