You are hereБлоги / Ёж's blog / Друпал – Работа с БД

Друпал – Работа с БД


Ёж 07 February 2009

Друпал – Работа с БД

Между Вашей БД (MySQL или PostgreSQL) и кодом PHP сайта в Друпале существует слой абстракции базы данных, благодаря которому можно использовать разные типы баз данных, используя один и тот же код. Это позволяет избежать многих ошибок, и к тому же не несёт никаких ограничений в использовании SQL. И очень удобно – например, Вам нужно сменить сервер баз данных с PostgreSQL на MySQL. Без абстракционного слоя Вам пришлось бы вручную изменять все SQL запросы, а так – ничего не нужно делать вообще. Слой абстракции сам будет по-другому обращаться к другому типу сервера.

Как Друпал определяет тип БД? Активация БД для последующих запросов осуществляется через функцию db_set_active. Сперва проверяется значение переменной $db_url в файле settings.php. Если переменная начинается с mysql, тогда Друпал использует оператор include() с файлом includes/database.mysql.inc; если же она начинается с pgsql – тогда с файлом includes/database.pgsql.inc.

Чаще всего запрос к активной БД осуществляется через функцию db_query. Рассмотрю простейшие запросы SELECT, INSERT, UPDATE и DELETE.

db_query('SELECT * FROM {joke} WHERE vid = %d', $node->vid);

Данный запрос возвращает все ряды из таблицы joke, у которых значение поля vid является целочисленным значением (integer – спецификатор %d), равным значению переменной $node->vid.

db_query("INSERT INTO {joke} (nid, vid, punchline) VALUES (%d, %d, '%s')", $node->nid, $node->vid, $node->punchline);

Данный запрос вставляет в таблицу joke ряд. Новый ряд включает в себя три значения. Два целочисленных (поля nid и vid – в них вставляются значения переменных $node->nid и $node->vid) и одно строковое, что мы и обозначили спецификатором %s – string (вставляется значение переменной $node->punchline).

db_query("UPDATE {joke} SET punchline = '%s' WHERE vid = %d", $node->punchline, $node->vid);

Данный запрос изменяет значение поля punchline для ряда, в котором значение поля vid равно значению переменной $node->vid. Вставляется новое значение, равное значению переменной $node->punchline.

db_query('DELETE FROM {joke} WHERE nid = %d', $node->nid);

Данный запрос удаляет из таблицы joke все ряды, для которых значение поля nid является равным значению переменной $node->nid.

Напоследок давайте рассмотрим пример файла .install, который осуществляет установку модуля – а для нода-модулей обычно необходимо создать таблицу. На этот раз пример для версии 5.x (из файла book.install):

<?php

/**
* Реализация функции hook_install().
*/
function book_install() {
switch (
$GLOBALS['db_type']) {
case
'mysql': // Запрос идентичен запросу для mysqli.
case 'mysqli':
db_query
("CREATE TABLE {book}
(
vid int unsigned NOT NULL default '0',
nid int unsigned NOT NULL default '0',
PRIMARY KEY (vid),
KEY nid (nid),
) /*!40100 DEFAULT CHARACTER SET UTF8 */ "
);
break;
case
'pgsql':
db_query
("CREATE TABLE {book}
(
vid int_unsigned NOT NULL default '0',
nid int_unsigned NOT NULL default '0',
PRIMARY KEY (vid)
)
"
);
db_query("CREATE INDEX {book}_nid_idx ON {book} (nid)");
break;
}
}
?>

Как мы видим – с помощью оператора switch корректируется запрос для разных серверов баз данных.

В статье я опирался на книгу Pro Drupal Development первого издания и на справочник API Друпала.

Ёж

]]>]]>
ССылки

RSS-материал