Урок - Функция выполнения запросов db_query() в Drupal 7

Главная » Курсы » Курс Drupal 7, Разработка модулей » Урок - Функция выполнения запросов db_query() в Drupal 7

Обучающий онлайн курс
Drupal 7, Разработка модулей

Лицензия: Копирование запрещено.

Обзор функции db_query()

Функция db_query(), в Drupal 7, не является совместимой с db_query() из Drupal 6. В Drupal 7 функция db_query() принимает три аргумента. Первый аргумент - запрос, второй аргумент - массив заменителей(placeholders) для вставки в запрос, третий - дополнительные опции. В функции db_query() можно использовать два типа заменителей(placeholders):

  • обычные
  • именные

Для обычных заменителей используется знак вопроса (?), что бы указать место вставки:

// запрос SELECT id, title  FROM {node} WHERE `uid` = ? AND `type` = ?"

// в Drupal 6 запрос выполнялся так:
// db_query('SELECT title FROM {node} WHERE uid = %d AND type = "%s"', 50, 'page');

// в Drupal 7
$result = db_query('SELECT * FROM {node} WHERE uid = ? AND type = ?', array(1, 'page'));
print_r($result->fetchObject());

Для именных заменителей для, указания места вставки, используется ключ из ассоциативного массива плейсхолдеров:

$result = db_query('SELECT * FROM {node} WHERE uid = :user_id AND type = :node_type', array(':user_id' => 1, ':node_type' => 'page'));
print_r($result->fetchObject());

Обзор функции db_query()

Третьим аргументом функции db_query() является массив опций для дополнительного управления запросом. Ниже приведено описание ключей массива опций.

  • 'target' (по умолчанию 'default') - имя базы к которой направялется запрос.
  • 'fetch' (по умолчанию PDO::FETCH_OBJ) - формат в котором необходимо возвращать данные. Варианты: PDO::FETCH_ASSOC, PDO::FETCH_BOTH, PDO::FETCH_OBJ, PDO::FETCH_NUM или строка (имя класса).
  • 'return' (по умолчанию Database::RETURN_STATEMENT) - вариант в котором необходимо возвращать результат о запросе.
  • 'throw_exception' (по умолчанию TRUE) - необхдимо ли вызывать исключение при неправильном запросе.
Пример:
$nodes = db_query('SELECT * FROM {node}', array(), array(
	'fetch' => PDO::FETCH_ASSOC,
));
print_r($nodes->fetch());

$nodes = db_query('SELECT * FROM {node}', array(), array(
	'fetch' => PDO::FETCH_OBJ,
));
print_r($nodes->fetch());

Примеры запросов используя db_query()

Использование числового плейсхолдера:

// запрос: SELECT uid, login FROM {users} WHERE uid = 1

// Для сравнения, код для Drupal 6:
$users = db_query('SELECT uid, login FROM {users} WHERE uid = %d', 1);
print_r(db_fetch_object($users));

//	пример для Drupal 7
$users = db_query('SELECT uid, login FROM {users} WHERE uid = :uid', array(':uid' => 1));
print_r($users->fetchObject());

Использование строкового плейсхолдера:

// запрос: SELECT uid, login FROM {users} WHERE login = "admin"

// Для сравнения, код для Drupal 6:
$users = db_query('SELECT uid, login FROM {users} WHERE uid = "%s"', 'admin');
print_r(db_fetch_object($users));

//	пример для Drupal 7
$users = db_query('SELECT uid, login FROM {users} WHERE login = :login', array(':login' => 'admin'));
print_r($users->fetchObject());

Объединение двух таблиц с помощью INNER JOIN:

$nodes = db_query('SELECT * FROM {node} n INNER JOIN {users} u ON u.uid = n.uid');
print_r($users->fetchObject());

Объединение двух таблиц с помощью LEFT JOIN:

$nodes = db_query('SELECT * FROM {node} n LEFT JOIN {users} u ON u.uid = n.uid');

Получение единственной записи:

$nodes = db_query('SELECT * FROM {node} n WHERE nid = :nid', array(':nid' => 1))->fetchField();
// или
$nodes = db_query('SELECT * FROM {node} n WHERE nid = :nid', array(':nid' => 1))->fetchObject();

Подсчитать количество записей:

$count = db_query('SELECT COUNT(*) as cnt FROM {node}')->fetchField();
print_r($count);

Обновление данных используя функцию db_query():

$users = db_query('UPDATE {users} SET login = :login WHERE uid = :uid', array(':login' => 'admin', ':uid' => 1));

Вставка данных используя функцию db_query():

db_query('INSERT INTO {events} (date = :date, title = :title)', array(':date' => '2011-01-01', ':title' => 'Title'));

Удаление данных используя функцию db_query():

db_query('DELETE FROM {users} WHERE uid = :uid', array(':uid' => 1));

Итог

Функция db_query() возволяет задавать запросы любой сложности используя синтаксис SQL. Однако помните, что есть и такий функции в Drupal 7 как db_select(), db_delete(), db_insert(), db_update().

Источники