2012-04-01 5 views
4

У меня возникли проблемы с пониманием концепции сериализации/unserialize в PHP.serialize/unserialize php object

Предположим, у меня есть очень простой PHP объект (класс SomeObject) и после установки атрибутов этого объекта я хочу сериализовать:

Так я называю: serialize($someObject);

Я хочу передать этот сериализованный объект в другой PHP Skript через HTML форму, так что я установить его как скрытое значение:

<input type="hidden" name="someObject" value="<? print $someObject; ?>" 

В следующем PHP скрипт я хочу использовать десериализируются, чтобы получить мой объект обратно и передать его, например к базам данных.

$unserialize = unserialize($_POST['someObject']) 

Но это всегда возвращает BOOL (false) - так что мне здесь не хватает?

Благодарим за помощь!

+2

хорошо .. сделайте 'var_dump ($ _POST ['someObject']);' и посмотрите .. также, вы должны использовать сеансы для этого, а не скрытые поля ввода. –

+0

Что означает $ _POST ['someObject'] во втором скрипте? – deceze

+1

Я не знаю никаких гарантий того, что сериализованная строка не будет содержать '' ', и если это произойдет, сгенерированный HTML будет нарушен. Если unserialize() не может десериализовать объект, он вернет' false' –

ответ

1

Вы должны иметь класс, определенный в вашем втором сценарии, прежде чем десериализируются() объект

+0

hm Я не уверен, что правильно понял, поэтому я использую что-то вроде '$ object = new someObject();' и позже '$ unserialized = unserialize ($ _ POST ['someObject ']); $ object = $ unserialized'? Это также возвращает FALSE в моем случае – MrBr

+0

Ну, похоже, вы запутались в определении класса и создании объекта ... $ object = new someObject() создает экземпляр объекта ... вы уже должны были определить класс someObject, прежде чем вы сможете это сделать. Акт unserializing сериализованного объекта затем создаст экземпляр объекта, поэтому ваш $ unserialized = unserialize ($ _ POST ['someObject']), сделайте это, создав объект в переменной $ unserialized .... $ object = $ unserialized; создаст клон $ unserialized object.Пожалуйста, попытайтесь определить, где именно происходит ваша ошибка. –

5

Сериализованный строка выглядит следующим образом:

O:1:"a":1:{s:3:"foo";s:3:"100";} 

Вы должны urlencode/urldecode сериализованные строки в не допускайте, чтобы любые символы в сериализованном представлении нарушали разметку. Посмотрите на свой источник страницы. Первая цитата скорее всего закончила ваш атрибут значения HTML. Таким образом, вы получили что-то вроде:

<input ... value="O:1:"a":1:{s:3:"foo";s:3:"100";}"> 

Так что ваши $_POST никогда не будут содержать полную последовательную строку, а только O:1:

Если это не проблема, убедитесь, что вы получили упорядоченную строку из объекта в первое место. Также имейте в виду, что некоторые объекты не могут быть сериализованы или модифицированы, когда (un) сериализовано. Обратитесь к Notes in PHP Manual for serialize for details.

Если вам не нужно отправлять объекты на разных серверах, на которых запущен PHP, рассмотрите возможность их сохранения в Session. Это проще, менее подвержено ошибкам и более безопасным, потому что объект не может быть подделан во время транзита.

+0

Большое спасибо. Мне удалось сделать это с помощью $ _SESSION. – MrBr

+0

@MrBr хорошо, да. тем более разумное решение в любом случае. – Gordon