Работа с БД в Drupal 7

Поддерживаемые СУБД
MySQL (> 90% сайтов)
PostgreSQL
SQLite
MSSQL и Oracle (дополнительный модули)


Способы работы с БД
Plain SQL queries
PDO (PHP Data objects)
Настройка подключения к БД


В файле /sites/default/settings.php
$databases = array (
  'default' => //connection
  array (
    'default' => //target
    array (
      'database' => 'drupal7db',
      'username' => 'root',
      'password' => 'secret',
      'host' => 'localhost',
      'port' => '',
      'driver' => 'mysql',
      'prefix' => '',
    ),
  ),
);
Выполнение запросов SELECT
Plain SQL
$nodes = db_query(
 "SELECT nid, title
  FROM {node}
  WHERE type = :type
     AND uid = :uid",
 array(':type' => 'page', ':uid' => 1));
PDO
$nodes = db_select('node', 'n')
 ->fields('n', array('nid', 'title'))
 ->condition('n.type', 'page')
 ->condition('n.uid', 1)
 ->execute();
Обходим полученные записи
foreach ($nodes as $node) {
  $items[$node->nid] = $node->title;
}
Запрос SELECT
                 с INNER JOIN, LIMIT и ORDER BY
Plain SQL
$result = db_query(
"SELECT n.title, u.name
 FROM {node} n
  INNER JOIN {users} u ON n.uid = u.uid
 ORDER BY title DESC
 LIMIT 0, 10");
PDO
$query = db_select('node', 'n')
 ->innerJoin('users', 'u', 'n.uid = u.uid')
 ->fields('n', array('title'))
 ->fields('u', array('name'))
 ->orderBy('n.title', 'DESC')
 ->range(0, 10)
 ->execute();
Запрос SELECT для получение количества записей


Plain SQL
$count = db_query(
 "SELECT COUNT(*) FROM {node}")
->fetchField();
PDO вариант 1
$count = db_select('node')
 ->countQuery()
 ->execute()
 ->fetchField();
PDO вариант 2
$count = db_select('node')
 ->addExpression('COUNT(*)')
 ->execute()
 ->fetchField();
Запрос SELECT со сложными условиями WHERE

Plain SQL
$nodes = db_query(
"SELECT *
 FROM {node}
 WHERE title LIKE :title
  AND (uid = :uid OR status = :status)",
array(':title' => '%' . db_like('somestring') . '%', ':uid' => 1, ':status' => 0));
PDO
$nodes = db_select('node', 'n')
->fields('n')
->condition('n.title', '%' . db_like('somestring') . '%', 'LIKE')
->condition(
  db_or()
   ->condition('n.uid', 1)
   ->condition('n.status', 0)
)
->execute();
Варианты получения результатов запроса SELECT


по-умолчанию - массив объектов
fetchAllKeyed() - ассоциативный массив
fetchAllAssoc($key) - ассоциативный массив сгрупированный по
указанному полю
fetchCol() - массив значений одной колонки
fetchField() - единичное значение поля
rowCount() - кол-во строк таблицы затронутых запросом
getQueryString() - сформированный SQL-запрос
UPDATE — запросы на обновление значений

Plain SQL (не рекомендуется)
db_query(
 "UPDATE {node}
  SET status = :status
  WHERE nid = :nid",
array(':status' => 1, ':nid' => 123));


PDO
db_update('node')
 ->fields(array('status' => 1))
 ->condition('nid', 123)
 ->execute();
INSERT — запросы на
                            вставку значений
Plain SQL
db_query(
"INSERT INTO {mytable} (intvar, stringvar, floatvar)
  VALUES (:int, :string, :float)",
array(':int' => 1, ':string' => 'somestring', ':float' => 3.14));
PDO
db_insert('mytable')
 ->fields(array('intvar' => 5, 'stringvar' => 'somestring', 'floatvar' => 3.14))
 ->execute();
DELETE — запросы на удаление значений

Plain SQL
db_query(
"DELETE FROM {node}
 WHERE uid = :uid AND created < :created",
array(':uid' => 1, ':created' => time() - 3600));


PDO
db_delete('node')
 ->condition('uid', 1)
 ->condition('created', time() - 3600, '<')
 ->execute();
Специальные таблицы


Variables — хранение настроек модулей
variable_set($name, $value)
variable_get($name, $default = NULL)
variable_del($name)


Cache, Cache_* — хранение кеша
cache_set($cid, $data, $bin = 'cache', $expire = CACHE_PERMANENT)
cache_get($cid, $bin = 'cache')


Node, User и другие объекты
вставлять, обновлять или удалять нужно только с помощью API
Расширенные возможности

Работа с несколькими БД

Master/Slave репликация

Поддержка транзакций
Ссылки на подробную информацию


http://api.drupal.org/api/drupal/includes!database!database.inc/
group/database/7

http://drupal.org/developing/api/database

http://xandeadx.ru/blog/drupal/88

http://php.net/pdo
Контакты

Фиделин Евгений

Компания QArea

Email: eugene.fidelin@gmail.com

Skype: eugene.fidelin

Работа с БД в Drupal 7

  • 1.
    Работа с БДв Drupal 7 Поддерживаемые СУБД MySQL (> 90% сайтов) PostgreSQL SQLite MSSQL и Oracle (дополнительный модули) Способы работы с БД Plain SQL queries PDO (PHP Data objects)
  • 2.
    Настройка подключения кБД В файле /sites/default/settings.php $databases = array ( 'default' => //connection array ( 'default' => //target array ( 'database' => 'drupal7db', 'username' => 'root', 'password' => 'secret', 'host' => 'localhost', 'port' => '', 'driver' => 'mysql', 'prefix' => '', ), ), );
  • 3.
    Выполнение запросов SELECT PlainSQL $nodes = db_query( "SELECT nid, title FROM {node} WHERE type = :type AND uid = :uid", array(':type' => 'page', ':uid' => 1)); PDO $nodes = db_select('node', 'n') ->fields('n', array('nid', 'title')) ->condition('n.type', 'page') ->condition('n.uid', 1) ->execute(); Обходим полученные записи foreach ($nodes as $node) { $items[$node->nid] = $node->title; }
  • 4.
    Запрос SELECT с INNER JOIN, LIMIT и ORDER BY Plain SQL $result = db_query( "SELECT n.title, u.name FROM {node} n INNER JOIN {users} u ON n.uid = u.uid ORDER BY title DESC LIMIT 0, 10"); PDO $query = db_select('node', 'n') ->innerJoin('users', 'u', 'n.uid = u.uid') ->fields('n', array('title')) ->fields('u', array('name')) ->orderBy('n.title', 'DESC') ->range(0, 10) ->execute();
  • 5.
    Запрос SELECT дляполучение количества записей Plain SQL $count = db_query( "SELECT COUNT(*) FROM {node}") ->fetchField(); PDO вариант 1 $count = db_select('node') ->countQuery() ->execute() ->fetchField(); PDO вариант 2 $count = db_select('node') ->addExpression('COUNT(*)') ->execute() ->fetchField();
  • 6.
    Запрос SELECT сосложными условиями WHERE Plain SQL $nodes = db_query( "SELECT * FROM {node} WHERE title LIKE :title AND (uid = :uid OR status = :status)", array(':title' => '%' . db_like('somestring') . '%', ':uid' => 1, ':status' => 0)); PDO $nodes = db_select('node', 'n') ->fields('n') ->condition('n.title', '%' . db_like('somestring') . '%', 'LIKE') ->condition( db_or() ->condition('n.uid', 1) ->condition('n.status', 0) ) ->execute();
  • 7.
    Варианты получения результатовзапроса SELECT по-умолчанию - массив объектов fetchAllKeyed() - ассоциативный массив fetchAllAssoc($key) - ассоциативный массив сгрупированный по указанному полю fetchCol() - массив значений одной колонки fetchField() - единичное значение поля rowCount() - кол-во строк таблицы затронутых запросом getQueryString() - сформированный SQL-запрос
  • 8.
    UPDATE — запросына обновление значений Plain SQL (не рекомендуется) db_query( "UPDATE {node} SET status = :status WHERE nid = :nid", array(':status' => 1, ':nid' => 123)); PDO db_update('node') ->fields(array('status' => 1)) ->condition('nid', 123) ->execute();
  • 9.
    INSERT — запросына вставку значений Plain SQL db_query( "INSERT INTO {mytable} (intvar, stringvar, floatvar) VALUES (:int, :string, :float)", array(':int' => 1, ':string' => 'somestring', ':float' => 3.14)); PDO db_insert('mytable') ->fields(array('intvar' => 5, 'stringvar' => 'somestring', 'floatvar' => 3.14)) ->execute();
  • 10.
    DELETE — запросына удаление значений Plain SQL db_query( "DELETE FROM {node} WHERE uid = :uid AND created < :created", array(':uid' => 1, ':created' => time() - 3600)); PDO db_delete('node') ->condition('uid', 1) ->condition('created', time() - 3600, '<') ->execute();
  • 11.
    Специальные таблицы Variables —хранение настроек модулей variable_set($name, $value) variable_get($name, $default = NULL) variable_del($name) Cache, Cache_* — хранение кеша cache_set($cid, $data, $bin = 'cache', $expire = CACHE_PERMANENT) cache_get($cid, $bin = 'cache') Node, User и другие объекты вставлять, обновлять или удалять нужно только с помощью API
  • 12.
    Расширенные возможности Работа снесколькими БД Master/Slave репликация Поддержка транзакций
  • 13.
    Ссылки на подробнуюинформацию http://api.drupal.org/api/drupal/includes!database!database.inc/ group/database/7 http://drupal.org/developing/api/database http://xandeadx.ru/blog/drupal/88 http://php.net/pdo
  • 14.