1

ちょっと変わった/漠然とした質問で事前に申し訳ありません:)。MySQLデータベースに保存されているこの種のフォーマットに何度か遭遇しましたが、データがどのように使用されているのか疑問に思っていますか?たとえば、このコード行はbbPressフォーラムプラグインbb_messageからのものです。

a:8:{s:9: "max_inbox"; i:50; s:13: "auto_add_link"; b:1; s:9: "email_new"; b:1; s:11: "email_reply"; b :1; s:9: "email_add"; b:1; s:13: "email_message"; b:0; s:16: "threads_per_page"; i:0; s:7: "version"; s:3 :"1.0";}

文字や文字はどうしたの?たとえば、s:9: "max_inbox"は9文字の文字列を指し、文字列はmax_inboxだと思います。しかし、このデータがデータベースからプルされるときに、このデータはPHPでどのように操作されますか(そしてなぜs:9が必要になるのでしょうか)?

皆さんありがとう!

4

2 に答える 2

4

これは、PHP の serialize 関数によって生成される文字列だと思います。この関数を使用すると、(複雑な) オブジェクトまたは配列を文字列として表すことができます。

さらに、あなたが参照している数字は、文字列をトークン化して関連する部分に戻すのを容易にするためにおそらく必要だと思います(ここでそれが適切な用語であるかどうかはわかりません)。あまり考えずに、区切り文字 (:;") を含むシリアル化されたオブジェクトの実際の値でトークナイザーがチョークする可能性がある状況を回避することを意図していると思います。

于 2010-01-16T00:43:40.303 に答える
3

unserializeそのような文字列をデコードするには、PHP の関数を使用します。

PHP ドキュメントのシリアル化を解除する

この文字列は、次のようにこの配列にデコードされます。

php > $f='a:8:{s:9:"max_inbox";i:50;s:13:"auto_add_link";b:1;s:9:"email_new";b:1;s:11:"email_reply";b:1;s:9:"email_add";b:1;s:13:"email_message";b:0;s:16:"threads_per_page";i:0;s:7:"version";s:3:"1.0";}';
php > var_dump(unserialize($f));
array(8) {
["max_inbox"]=>
int(50)
["auto_add_link"]=>
bool(true)
["email_new"]=>
bool(true)
["email_reply"]=>
bool(true)
["email_add"]=>
bool(true)
["email_message"]=>
bool(false)
["threads_per_page"]=>
int(0)
["version"]=>
string(3) "1.0"
}

このようにデータを保存する理由は、1 つのデータベース フィールドに複数のパラメーターを保存できるからです。

シリアル化された配列を保存すると、データベースのスキーマについて心配する必要がなくなります。Friendfeed は、たとえば MySQL でこれを行います。これは、MongoDB のような「NoSQL」ストレージ システムのスタイルにも似ています。私自身、PHPシリアライズよりもJSONを使用することを好みます。

于 2010-01-16T01:05:34.710 に答える