Проблема с десериализацией PHP

Почему unserialize не восстанавливает мой массив? См. код ниже..

// prints a:1:{s:8:"txn_type";s:32:"recurring_payment_profile_cancel";}
echo $item['response']; 

// prints nothing
print_r(unserialize($item['response']));

Я понимаю, почему print_r($response) ничего мне не дает

** редактировать - я это заметил

Примечание: unserialize() [function.unserialize]: ошибка по смещению 6 из 2797 байт в /home/reitinve/public_html/action/doc.php в строке 13.

Что это обозначает?


person John    schedule 13.02.2009    source источник
comment
Ваш вопрос спас мой день!   -  person thpoul    schedule 08.01.2012


Ответы (4)


Возможно ли, что $item['response'] содержит пробелы до или после него?

Проверка strlen($item['response']) дает вам 61.

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

Изменить: это сообщение об ошибке означает, что либо у вас МНОГО пробелов (почти 2 КБ), либо $item['response'] изменяется между echo и unserialize

person Greg    schedule 13.02.2009
comment
я попытался сделать обрезку, например unserialize(trim($item['response'])). Обрезка должна была удалить пробелы, верно? - person John; 13.02.2009
comment
да. Строка, которую вы называете echo'd, составляет 61 байт, но PHP говорит, что вы пытаетесь десериализовать 2797 байт, так что что-то происходит... - person Greg; 13.02.2009

работает для меня просто отлично. вы уверены, что $item['response'] это строка? да, похоже на ведущие пробелы.

и на вашем сервере разработки php никогда не должен давать вам «ничего». он должен быть настроен для выдачи всех ошибок, предупреждений и уведомлений. также вы можете использовать http://php.net/var_dump вместо print_r, так как это даст вам больше информации.

person SilentGhost    schedule 13.02.2009
comment
Если параметр unserialize не является строкой, будет показано предупреждение. - person cwallenpoole; 13.02.2009

Вот почему у меня возникла эта проблема и как я ее решил:

Я хранил массив в своем вводе, подобный этому:

value="<?php echo htmlspecialchars(serialize(array($a, $b))); ?>"

Здесь мне пришлось использовать htmlspecialchars() из-за возможных ошибок синтаксического анализа.

Затем, когда я попытался десериализовать, это дало мне эту ошибку Error at offset X of Y bytes in .... Я напечатал несериализованную строку на экране и понял, что html-эквиваленты некоторых символов вызывают ошибку.

Чтобы быть более ясным, двойные кавычки HTML-кода %22 вызывали эту ошибку. Поэтому я заменил их обратно кавычками, и это сработало.

unserialize(str_replace('%22', '"', $_POST['serialized']));

Поэтому лучше проверить, есть ли какие-либо html-коды в сериализованной строке, и заменить их исходными символами.

person kubilay    schedule 12.03.2013

Также будьте осторожны, если вы когда-нибудь попытаетесь поместить сериализованный массив в текстовую область, чтобы в конечном итоге передать его куда-то еще через Ajax, вы можете столкнуться с проблемами со специальными символами, такими как амперсанд (&), которые будут преобразованы в «», и этого достаточно чтобы ваш "сериализованный" массив не восстанавливался.

Я нашел использование rawurlencode и rawurldecode очень полезным, чтобы сделать мою сериализацию пуленепробиваемой, независимо от того, как она передается в моих сценариях;

$myArray = array("Bugs Bunny", "Tom & Jerry");

$serialized = rawurlencode(serialize($myArray));

$myUnserializedArray = rawurldecode(unserialize($serialized));
person Jivago    schedule 29.06.2016