2012-04-01 10 views
4

PHPでserialize/unserializeの概念を理解するのに問題があります。phpオブジェクトのシリアライズ/シリアライズ

は、私は非常に単純なPHPオブジェクト(クラスSomeObjectのを)持っていると、そのオブジェクトの属性を設定した後、私はそれをシリアル化したいと仮定します

だから私が呼ぶ:serialize($someObject)

私は隠された値として設定して、HTMLフォームを介して他のPHP skriptに、この直列化されたオブジェクトを転送したい:次のPHPスクリプトで

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

私は戻って私のオブジェクトを取得するためにアンシリアライズを使用したいですそれを転送するデータベースへ。

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

しかし、これは常にBOOL(false)を返すので、私はここで何が欠けていますか?

ありがとうございました!

あなたはアンシリアライズ(前に2番目のスクリプトで定義されたクラスを持っている必要があります
+2

よくvar_dump($ _POST ['someObject']); 'を作成して見てください。また、隠し入力フィールドではなくセッションを使用してください。 –

+0

$ _POST ['someObject']に2番目のスクリプトに含まれるものは何ですか? – deceze

+1

シリアル化された文字列に '' 'が含まれていないことは保証されていませんし、そうであれば生成されたHTMLは壊れます。unserialize()はオブジェクトを逆シリアル化できない場合、 –

答えて

1

)オブジェクト

+0

hm正しいことを理解しているかどうかわからないので、 '$ object = new someObject();'と '$ unserialized = unserialize($ _ POST ['someObject '); $ object = $ unserialized'?これは私の場合でもFALSEを返します – MrBr

+0

あなたはクラスの定義とオブジェクトのインスタンス化を混乱させるようです.... $ object = new someObject()はオブジェクトをインスタンス化しています...これを行う前にsomeObjectクラスを定義しておく必要があります。直列化されたオブジェクトのシリアル化を解除するとオブジェクトインスタンスが作成されるので、$ unserialized = unserialize($ _ POST ['someObject']);変数$ unserializedのオブジェクト... $ object = $ unserialized; $ unserializedオブジェクトのクローンを作成します。あなたのエラーがどこで発生しているのかを正確に特定してください。 –

5

がシリアライズされた文字列は次のようになります。urlencode/urldecodeにあなたが持っている

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

シリアライズされた文字列へシリアライズされた表現の文字がマークアップを壊さないようにします。あなたのページソースを見てください。最初の見積もりがHTML値属性を終了させた可能性があります。だからあなたの$_POSTがフルシリアル化された文字列を含んでいないが、これは問題ではない場合にのみO:1:

、必ず内のオブジェクトから直列化された文字列を持って作るん

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

:だからあなたのような何かを得ました最初の場所。また、いくつかのオブジェクトは直列化できないか、(un)直列化されたときに動作が変更されることに注意してください。 Notes in PHP Manual for serialize for details.

PHPを実行している別のサーバー間でオブジェクトを送信する必要がない場合は、代わりにSessionにオブジェクトを保持することを検討してください。トランジション中にオブジェクトを改ざんすることはできないため、エラーが発生しにくく、セキュリティが強化されています。

+0

ありがとうございます。私は$ _SESSIONでそれをすることができました。 – MrBr

+0

@MrBrまあ、はい。とにかくより賢明な解決策です。 – Gordon