2

私が得ている正確なエラーは次のとおりです。

ErrorException [通知]: unserialize(): オフセット 5/59 バイトでエラーが発生しました

MySQL の TEXT フィールドから返されるシリアル化されたデータは次のとおりです (エンコーディング: utf8、エンジン: InnoDB):

a:1:{s:12:"display_name";s:6:"Foo";}

シリアル化を解除した後の出力は次のとおりです。

array(1) { [0]=> bool(false) }

私はこのようなものを期待しています:

array(1) { ["display_name"]=> string(6) "Foo" }

Mac OS 10.8.4 で FuelPHP 1.6.1、PHP 5.4.10、MySQL 5.5.29、InnoDB 1.1.8 を使用しています。シリアル化されたエントリの一部は非シリアル化で機能しますが、他のエントリは機能しません。機能するエントリをコピーして、機能しないエントリに貼り付けると、同じエラーが表示されます。文字の問題だと思います。utf8、urlencode、およびストリップスラッシュにエンコードしようとしましたが、何も機能していないようです。

どんな助けでも大歓迎です!

アップデート

シリアル化された文字列には型がありました。プライバシーのために実際の表示名に貼り付けるときにこれを行いました。実際の文字列は次のとおりです。

a:1:{s:12:"display_name";s:3:"Foo";}

これを指摘してくれた@robwに感謝します。

更新と回答

私はhtml_entity_decode()今、シリアル化されたデータを次のように実行しています:

$unserialized = unserialize(html_entity_decode($serialized, ENT_QUOTES));

助けとアドバイスをありがとう!

4

1 に答える 1

3

あなたの問題はここにあります:s:6:"Foo"

Foo長さは 6 文字ではありません...そのため、期待どおりに解析されません。

試す:s:3:"Foo"

PS: これは、MySQL でデータを編集したようで、アプリケーションがそれを解析しようとしたときにエラーが発生しました。TYPE と VALUE に従って LENGTH を変更したことが 100% 確実でない限り、データベース内のシリアル化された値を編集しないでください。

于 2013-06-27T16:30:59.357 に答える