2009-02-13 4 views
6

Как происходит unserialize не восстанавливает мой массив? Смотрите ниже код ..Проблема с unserialize PHP

// 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 ($ ответ) не дает мне ничего

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

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

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

+1

Ваш вопрос спас мой день! – thpoul

ответ

3

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

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

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

Edit: это сообщение об ошибке означает, что либо у вас есть много неиспользованного (почти 2kB его), или $item['response'], изменяется между echo и unserialize

+0

Это мое предположение. – cwallenpoole

+0

Я попробовал поместить фишку как unserialize (обрезка ($ item ['response'])). Отделка должна была удалить белые пробелы прямо? – John

+0

Да. Строка, которую вы говорите, является echo'd, составляет 61 байт, но PHP говорит, что вы пытаетесь выполнить арифметику 2797 байт, поэтому что-то происходит ... – Greg

1

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

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

+0

Если параметр unserialize не является строкой, он отображает предупреждение. – cwallenpoole

+0

показывает, что строки начинаются с пробела. – SilentGhost

+0

true, но в конфигурации по умолчанию не будут отображаться уведомления – Greg

0

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

Я хранил массив в моем входе, похожее на это:

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 коды в сериализованной строке и заменить их обратно с оригинальными персонажами.

0

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

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

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

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

$myUnserializedArray = rawurldecode(unserialize($serialized)); 
Смежные вопросы