Я получаю сообщение об ошибке при попытке десериализации данных. Возникает следующая ошибка:
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 ";}}";
Ошибка вызвана одиночной кавычкой в данных. Как я могу решить эту проблему, когда сайт и база данных, с которыми я работаю, уже работают? К сожалению, я не могу переписать код, который отвечал за сериализацию и вставку данных в базу данных. Весьма вероятно, что эта проблема встречается в базе данных несколько раз.
Есть ли функция, которую я могу использовать, чтобы экранировать данные?
После дальнейших исследований я нашел обходное решение. В соответствии с этот блог:
«Оказывается, если есть», «,: или; в любом массиве
значения сериализации будет поврежден. «
Если бы я работал на сайте, который еще не был запущен, метод профилактики был бы 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 );
Нет ничего плохого в том, что ваш сериализованный текст опубликован. Кавычки внутри НЕ должны быть экранированы, потому что 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 без проблем.