Урок - База данных

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

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

Изменения в Database API в Drupal 7

  • Изменен синтаксиси подключения к базе данных.
  • Изменена работа функции db_query(). ((комментарий))
  • Объектный подход при работе с запросами к базе данных.

Подключение к базе данных

Изменился синтакис подключения сайта к базе данных:

// в Drupal 6
// $db_url = 'mysqli://username:password@localhost/basename';

// в Drupal 7
$databases['default']['default'] = array(
  'driver'   => 'mysql',
  'database' => 'basename',
  'username' => 'username',
  'password' => 'password',
  'host'     => 'localhost',
);

Выполнение запросов с помощью db_query() в Drupal 7

Drupal 7 поддерживает db_query(), но db_query() изменен при работе со вставками(placeholders).

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

// запрос: SELECT uid, login FROM {users} WHERE status = 1 AND name = "user"

// код для Drupal 6
$users = db_query('SELECT uid, login FROM {users} WHERE status = %d AND name = "%s"', 1, 'user');

// код для Drupal 7
$users = db_query('SELECT uid, login FROM {users} WHERE status = :status AND name = :name', array(':status' => 1, ':name' => 'user'));

Объектный подход при работе с базой данных.

Раньше для выполнения запросов к базе данных использовалась функция db_query(). Теперь каждому из типов запросов (вставка, удаление, обновление, выборка) соответствует своя функция (db_insert(), db_delete(), db_update(), db_select()). Каждая из этих функций возвращает объект позволяющий модифицировать и выполнять SQL запрос.

Функции для работы с базой данных

  • функция db_and()
  • функция db_close()
  • функция db_condition()
  • функция db_delete()
  • функция db_driver()
  • функция db_escape_field()
  • функция db_escape_table()
  • функция db_insert()
  • функция db_like()
  • функция db_merge()
  • функция db_next_id()
  • функция db_or()
  • функция db_query()
  • функция db_query_range()
  • функция db_query_temporary()
  • функция db_select()
  • функция db_set_active()
  • функция db_transaction()
  • функция db_truncate()
  • функция db_update()
  • функция db_xor()

Обработка результатов запросов тоже изменилось. Вместо функций db_result(), db_fetch_array(), db_fetch_object() и т. д., пришли методы класса DatabaseStatementInterface:

  • Метод execute() - выполнение запроса
  • Метод fetchAllAssoc() - возвращает результат запроса в виде ассоциативного массива ключей заданного поля
  • Метод fetchAllKeyed() - возвращает результат как единый ассоциативный массив
  • Метод fetchAssoc() - выбирает следующую строку и возвращает её в качестве ассоциативного массива
  • Метод fetchCol() - возвращает один столбец результирующего набора, как индексированный массив
  • Метод fetchField() - возвращает одно поле из следующей записи из результирующего набора
  • Метод getQueryString() - возвращает строку запроса
  • Метод rowCount() - возвращает число строк, которые возвращает запрос

Необходимым условием выполнения запроса является вызов метода execute().

Примеры выполнения запросов к базе данных.

Сейчас мы рассмотрим только примеры, а углубимся в изучение на следующих уроках.

Пример извлечения данных для Drupal 6 и Drupal 7.

// Запрос: SELECT * FROM {node}

// для Drupal 6 команда была бы такой:
$result = db_query("SELECT * FROM {node}');
print_r(db_fetch_object($result));

// для Drupal 7 вариант 1
$result = db_select('node')->fields('node')->execute();
print_r($result->fetchObject());

Пример получения данных для Drupal 6 и Drupal 7, с условием:

// Запрос: SELECT * FROM {node} WHERE status = 1

// для Drupal 6 команда была бы такой:
$result = db_query("SELECT * FROM {node} WHERE status = %d', 1);
print_r(db_fetch_object($result));

// для Drupal 7 вариант 1
$result = db_select('node')->fields('node')->condition('status', 1)->execute();
print_r($result->fetchObject());

// для Drupal 7 вариант 2
$nodes = db_select('node');
$nodes
  ->fields('node')
  ->condition('status', 1);
$result = $nodes->execute();
print_r($result->fetchObject());

// для Drupal 7 вариант 3
$nodes = db_select('node');
$nodes->fields('node');
$nodes->condition('status', 1);
$result = $nodes->execute();
print_r($result->fetchObject());

Пример получения данных в Drupal 6 и Drupal 7, для сложного запроса:

// Запрос: SELECT n.title, n.created, u.name FROM {node} n JOIN {users} u ON n.uid = u.uid WHERE status = 1 GROUP BY u.uid ORDER BY created DESC LIMIT 0, 10

// для Drupal 6 команда была бы такой:
$result = db_query_range('SELECT n.title, n.created, u.name FROM {node} n JOIN {users} u ON n.uid = u.uid GROUP BY u.uid ORDER BY created DESC', 0, 10);
print_r(db_fetch_object($result));

// для Drupal 7
$query = db_select('node', 'n');
$query->join('users', 'u', 'n.uid = u.uid');
$query->groupBy('u.uid');
$query->fields('n', array('title', 'created'));
$query->fields('u', array('name'));
$query->orderBy('created', 'DESC');
$query->range(0, 10);
$result = $query->execute();
while ($record = $result->fetchAssoc()) {
   print_r ($record);
}

Пример вставки данных для Drupal 6 и Drupal 7.

// Drupal 6
db_query("INSERT INTO {table_name} (int_value, float_value, string_value) VALUES (%d, %f, '%s')", 100, 123.456, 'This is Хорошо');
$id = db_last_insert_id();

// Drupal 7
$id = db_insert('table_name')
  ->fields(array(
    'int_value' => 100,
    'float_value' => 123.456,
    'string_value' => 'This is Хорошо',
  ))
  ->execute();

Пример обновления данных для Drupal 6 и Drupal 7.

// Drupal 6
db_query('UPDATE {node} SET `title` = "%s", `status` = %d WHERE `uid` = %d', 'This is Хорошо', 1, 10);

// Drupal 7
$id = db_update('node')
  ->fields(array(
    'title' => 'This is Хорошо',
    'status' => 1,
  ))
  ->condition('uid', 10)
  ->execute();

Пример удаления данных для Drupal 6 и Drupal 7.

// Drupal 6
db_query('DELETE FROM {node} WHERE `uid` = %d AND `created` < %d', 10, time()-86400);

// Drupal 7
$id = db_delete('node')
  ->condition('uid', 10)
  ->condition('created', time()-86400, '<')
  ->execute();

Источники