PHP / MySQL formatinng: пример того, как используется этот тип данных? - PullRequest
1 голос
/ 16 января 2010

Заранее извините за странный / расплывчатый вопрос :). Я несколько раз сталкивался с такого рода форматированием, хранящимся в базах данных MySQL, и мне интересно, как используются данные? Например, эта строка кода взята из плагина bb_message для форумов bbPress.

а: 8: {s: 9: "max_inbox"; я: 50; s: 13: "auto_add_link"; б: 1; s: 9: "email_new"; б: 1; s: 11: "email_reply «; б: 1; s: 9: "Email_add"; б: 1; s: 13: "email_message"; б: 0; s: 16: "threads_per_page"; я: 0; s: 7: "версия"; s: 3: "1.0";}

Что случилось с символами и буквами? Например, я предполагаю, что s: 9: «max_inbox» относится к строке из девяти символов, и строка max_inbox. Но как эти данные обрабатываются с помощью PHP (и зачем нужен s: 9), когда они извлекаются из базы данных?

Спасибо всем!

Ответы [ 2 ]

4 голосов
/ 16 января 2010

Я считаю, что это строка, которая генерируется функцией сериализации PHP.Эта функция позволяет вам представлять (сложный) объект или массив в виде строки.

Кроме того, я думаю, что числа, на которые вы ссылаетесь, вероятно, необходимы для выполнения токенизации (не уверен, что это подходящий термин здесь)Вернитесь к соответствующим частям проще.Не задумываясь об этом, я предполагаю, что он предназначен для обхода ситуаций, когда токенизатор может задушить действительные значения сериализованного объекта, который содержит разделители (:; ").

3 голосов
/ 16 января 2010

Используйте функцию PHP unserialize для декодирования таких строк.

десериализация 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"
}

Причина хранения таких данных заключается в том, что вы можете хранить несколько параметров в одном поле базы данных.

Хранение сериализованных массивов позволяет вам не беспокоиться о схеме вашей базы данных. Friendfeed, например, делает это с MySQL, и это также похоже на стиль систем хранения NoSQL, таких как MongoDB. Я предпочитаю использовать JSON, а не PHP-сериализацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...