unserialize () ошибка в смещении — вызвано одинарной кавычкой

Я получаю сообщение об ошибке при попытке десериализации данных. Возникает следующая ошибка:

unserialize(): Error at offset 46 of 151 bytes

Вот сериализованные данные:

s:151:"a:1:{i:0;a:4:{s:4:"name";s:15:"Chloe O'Gorman";s:6:"gender";s:6:"female";s:3:"age";s:3:"3_6";s:7:"present";s:34:"Something from Frozen or a jigsaw ";}}";

Ошибка вызвана одиночной кавычкой в ​​данных. Как я могу решить эту проблему, когда сайт и база данных, с которыми я работаю, уже работают? К сожалению, я не могу переписать код, который отвечал за сериализацию и вставку данных в базу данных. Весьма вероятно, что эта проблема встречается в базе данных несколько раз.

Есть ли функция, которую я могу использовать, чтобы экранировать данные?

2

Решение

После дальнейших исследований я нашел обходное решение. В соответствии с этот блог:

«Оказывается, если есть», «,: или; в любом массиве
значения сериализации будет поврежден. «

Если бы я работал на сайте, который еще не был запущен, метод профилактики был бы base64_encode мои сериализованные данные до того, как они были сохранены в базе данных, примерно так:

base64_encode( serialize( $my_data ) );

А потом:

unserialize( base64_decode( $encoded_serialized_string ) );

при получении данных.

Однако, поскольку я не могу изменить то, что уже было сохранено в базе данных, этот очень полезный пост предоставляет решение, которое работает вокруг проблемы:

$fixed_serialized_data = preg_replace_callback ( '!s:(\d+):"(.*?)";!', function($match) {
return ($match[1] == strlen($match[2])) ? $match[0] : 's:' . strlen($match[2]) . ':"' . $match[2] . '";';
}, $my_data );

$result = unserialize( $fixed_serialized_data );
6

Другие решения

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

php > $foo = "This string contains a \" quote and a ' quote";
php > $bar = serialize($foo);
php > $baz = unserialize($bar);
php > echo "$foo\n$bar\n$baz\n";
This string contains a " quote and a ' quote
s:44:"This string contains a " quote and a ' quote";
This string contains a " quote and a ' quote

Обратите внимание на отсутствие ЛЮБОГО вида экранирования в сериализованной строке — кавычки внутри строки находятся как есть, без кавычек, без экранирования, без кодирования.

После публикации ваши сериализованные данные должным образом десериализуются в обычную строку JSON без проблем.

0

По вопросам рекламы [email protected]