Php unserialize не работает

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

$row[‘information’] — возвращает то что выше из базы данных.
Возвращает пустоту, я уже сама не знаю что может быть не так, возможно конечно глаз за мылился и не могу найти очевидную ошибку, но прошу вас о помощи

Простой 1 комментарий

Compolomus

Помогло решение через кодировку входящей строки через base64_encode(serialize($information));
И выводом unserialize(base64_decode($row[‘information’]));

serialize, вообще говоря, выдает бинарные данные, если вы его храните в базе в поле VARCHAR/TEXT, то могут быть пролемы (это, кстати, написано в документации).

Вот у вас, например, длина первого элемента content указана как 1094, а на деле строка длины 1085, поэтому unserialize лажается. Вероятно, при сохранении в БД или еще на каком-то этапе были потеряны какие-то символы.
В общем, для начала сохраняйте это в поле типа BLOB

Спасибо за ваш ответ, я документацию читала у меня поле было LONGTEXT и ограничений на символы не стояло
Сделала BLOB, но результат это не дало

Прогоните вашу строку через https://ru.functions-online.com/unserialize.html, сразу увидите позицию, на которой unserialize() спотыкается. Кстати, в лог файле ошибок HTTP-сервера эта ошибка обязана присутствовать, потому что PHP её должен отправлять в STDERR.

P.S. И поменять на BLOB мало, надо еще и ошибку в serialized-строке убрать.

Проблема ещё в том, что сама строка у меня отлично проходит unserialize, а когда я её передаю через $row[‘information’] она не отображает ничего

Елизавета Цезурк, поменяйте поле в бд на BLOB и повторно запишите в него результат serialize().
Если проблема в этом, то просто поменять тип поля уже не поможет, информация уже испорчена.

сбой в unserialize выдает всего лишь Notice. Так что если вы их отключили в error_reporting, то и в логах будет пусто, и код будет «работать».

ничего непонятно. Откуда вы тогда берете строку, которая проходит unserialize? $row[‘information’] же из БД? Распечатывали, смотрели, что там? А через напрямую в базе (лучше через консольный клиент) смотрели?

ThunderCat

Rsa97

 'Услуги', 'content' => 'На базе стоматологии «ПрезиДент» на Выставочной проводятся экспертные консультации, лечение под наркозом и с седацией, лечение под микроскопом; компьютерная томография и рентгенография, составляется план лечения. Имеется детское отделение.Оказываются услуги по таким направлениям, как терапия, хирургия, ортопедия, профессиональная гигиена, пародонтология. Предоставляются следующие виды услуг лечение кариеса и патологий пародонта, пломбирование зубов композитами, отбеливание эмали по технологии ZOOM 4, вживление имплантов и инсталляция коронок из металлокерамики и диоксид циркония.' ], [ 'title' => 'Проезд', 'content' => 'До стоматологии «ПрезиДент» на Выставочной можно доехать на метро. Ближайшие остановки «Шелепиха» или "Выставочная". От "Выставочной" необходимо подняться к Экспоцентру повернуть налево и следовать прямо до стоматологии. От метро "Шелепиха" - поднявшись на поверхность, нужно сесть на любой автобус № т54, т66, 4, 69, 152 и проследовать до остановки «Детская больница». Покинув транспорт, надо повернуть на улицу Антонова-Овсеенко и пройти к высотному зданию по адресу ул. 3-я Красногвардейская дом 3 (вход с улицы Антонова-Овсеенко).' ], [ 'title' => 'Парковка', 'content' => 'Для пациентов есть бесплатная парковка. Въезд с улицы Антонова-Овсеенко. Для въезда на территорию нужно позвонить администратору за 2 минуты до прибытия.' ] ]; $s = serialize($s); print $s;

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

Источник

Handling a PHP unserialize offset error… and why it happens

I discovered recently the importance of proper collation of database tables. I inherited a proprietary CMS to manage. The default collation was latin1_swedish_ci. Apparently it’s because “The bloke who wrote it was co-head of a Swedish company”. The problem occurred when a form we had on our site began getting submissions with foreign characters. The database collation couldn’t accept the characters and was saving them as question marks (?).

“Serialization is the process of translating data structures or object state into a format that can be stored.” For example the array:

$returnValue = serialize(array(‘hello’, ‘world’));

This is what the above string means:

  • There is an array that is 2 in length. a:2.
  • The first item in the array has a key that is an integer with the value of 0. i:0.
  • The value for that item is a string that is 5 characters long, which is “hello”. s:5.
  • The second item in the array has a key that is an integer with the value of 1. i:1.
  • The value for that item is a string that is 5 characters long, which is “world”. s:5.

An unserialize offset error can occur when the string count in the serialized data does not match the length of the string being saved. so in the above example that would look like this:

Notice the number ‘4’, while there are really 5 characters in the world ‘hello’.

So the question is, why would the offset happen when a ? replaces a foreign character?

To understand why, you need to dig into how UTF-8 works and things will become clear.

The UTF-8 value of ‘?’ is ‘3f’, while the value for ‘Æ’ is ‘c3 86’. ’?’ translates into s:1:“?”; while ‘Æ’ translates into s:2:“Æ”; . Notice the 2 replacing the 1 in the string length. So basically, what’s happening is that when php serializes the data it is storing the foreign character as a double the length but when it’s passed to MySQL, when the table isn’t formatted for UTF-8, the database converts the character to a ?, which is then stored as a single character. **But the serialization length is not updated, **so when you go and unserialize the data there is an offset error.

How to resolve the problem

There are several articles that provide solutions. The most popular is to use the base64_encode() function around the serialized data. This will prevent the data from getting corrupted since base64 converts the data to ASCII which any collation can take.

//to safely serialize $safe_string_to_store = base64_encode(serialize($multidimensional_array));

If you don’t have access to your database, or don’t want to fool with it, this is a great solution. You can also set your table collation to utf8_general_ci or utf8_general_ci and that should solve your problem as well (that’s what we did).

But what if you already have bad data in your database, like we had, and you’re getting the horrid ’Notice: unserialize() [function.unserialize]: Error at Offset’ error. When you get this notice, chances are you’re not getting all your data either…

$fixed_serialized_data = preg_replace_callback ( ‘!s:(\d+):“(.*?)“;!‘, function($match) < return ($match[1] == strlen($match[2])) ? $match[0] : ’s:’ . strlen($match[2]) . ‘:“’ . $match[2] . ‘“;’; >, $error_serialized_data );

This will search out the strings, recount the length, and replace the string length with the correct value. Unfortunately it cannot recover what the original foreign character was, but at least the rest of your data will load.

I got the original code from StackOverflow, but since PHP 5.5 the /e modifier in preg_replace() has been deprecated completely and the original preg_match statement suggested will error out. So I rewrote it with preg_replace_callback().

Источник

Unserialize не читает

далее пропускаю через serialize, а вот для того чтобы прочитать что получилось, пропускаю через unserialize. Не читает по все видимости из-за присутствия тега . Как решить?

Unserialize array
Не могу понять как превратить строку в массив. $string = »; $arrayit =.

свой Unserialize
Здравствуйте. Вобщем, имеется строка one%two%three%four% ее надо первратить в массив Array ( .

Не работает функция unserialize
нормальный сериализованный массив функция не десериализует! или есть у кого-то рабочая функция.

Странная работа unserialize
Народ привет! Вот скажите пожалуйста, если кто-нибудь пользовался функцией unserialize в php? .

Эксперт PHP

ЦитатаСообщение от Gerd199 Посмотреть сообщение

$text = '[strong]123[/strong]'; $text = ' '.preg_replace(array('/\r/U','/dddd/', '/\[strong\]/', '/\[\/strong\]/'), array('
 '
,'','\','\'), $text); var_dump($text); $serialized = serialize($text); var_dump($serialized); $unserialized = unserialize($serialized); print_r($unserialized);

Эксперт PHP

ЦитатаСообщение от Gerd199 Посмотреть сообщение

$text = 'a:1:mxkd";s:4:"link";a:5:>>'; $text = preg_replace(array('/\
/U'
,'/ /','/\/','/\/'), array('','','\[strong\]','\[\/strong\]'), $text); var_dump($text); $serialized = serialize($text); var_dump($serialized); $unserialized = unserialize($serialized); print_r($unserialized);

Вот этот код, он нерабочий

Эксперт PHP

ЦитатаСообщение от Gerd199 Посмотреть сообщение

Я их не менл, мне функция сама так серилизовала. Изночально там масив и в нем еще 1-2 массива в глубь. Только с наличием [strong] не работает

Добавлено через 1 минуту
xdldld — ключ первого массива

Эксперт PHP

ЦитатаСообщение от Gerd199 Посмотреть сообщение

$text = preg_replace(array('/\
/U'
,'/ /','/\/','/\/'), array('','','\[strong\]','\[\/strong\]'), $text);

Эксперт PHP

ЦитатаСообщение от Gerd199 Посмотреть сообщение

ЦитатаСообщение от Jewbacabra Посмотреть сообщение

Array ( [2] => Array ( [title] => рпмм [sezon] => [ser] => [alt] => [key] => [text] => рврврвр[strong]hdjd[/strong] [link] => Array ( [720] => [460] => [360] => [240] => [140] => ) ) [3] => Array ( [title] => [sezon] => [ser] => [alt] => [key] => [text] => [link] => Array ( [720] => [460] => [360] => [240] => [140] => ) ) )

далее яего пропускаю через
то есть text пропускаю через этл, а затем обатно в масив
$text = ‘ ‘.preg_replace(array(‘/\r/U’,’/dddd/’, ‘/\[strong\]/’, ‘/\[\/strong\]/’), array(‘
 ‘,»,’\’,’\‘), $text);

не работает, блин я сейчас сижу с планшета, что не так? ткните носом, плиз

Добавлено через 22 минуты
наше косяк, сп

unserialize, как правильно сделать?
Дело такое — есть массив со стандартными ключами, его нужно загнать в бд, а потом вывести обратно.

Не могу понять почему Яндекс не читает мой Sitemap? а google читает.
Захожу в яндекс мастер выбираю sitemap а он мне пишет ошибка в файле sitemap невалидный sitemap Но.

Проблема с OCR Puma.Net (читает текст с одной картинки, но не читает с другой)
Здравствуйте, есть проект с оцр Puma.Net и есть 2 картинки 1ая и 2ая, только вот с первой картинки.

USBasp неправильно читает Flash, но правильно читает EEprom
Ребята выручайте, нужен мозговой штурм. Пару лет назад собрал USBasp, до недавнего времени.

Источник

Читайте также:  Java scheduled task at time
Оцените статью