Проблема несериализации PHP - PullRequest
6 голосов
/ 13 февраля 2009

Почему 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) ничего не дает

** edit - я заметил это

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

Что это значит?

Ответы [ 4 ]

3 голосов
/ 13 февраля 2009

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

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

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

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

1 голос
/ 13 февраля 2009

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

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

0 голосов
/ 29 июня 2016

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

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

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

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

$myUnserializedArray = rawurldecode(unserialize($serialized));
0 голосов
/ 12 марта 2013

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

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

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-коды, и заменить их исходными символами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...