Урок - Настройки подключения баз данных в Drupal 7

Главная » Курсы » Курс Drupal 7, Разработка модулей » Урок - Настройки подключения баз данных в Drupal 7

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

Лицензия: Копирование запрещено.
В этом материале рассмотрим примеры настроек для параметра $databases для различных структур баз данных.

Пример 1:

Исходные данные:

Drupal 7 установлен в одну базу данных.
База данных: drupal7
Пользователь: root
Пароль: root
Хост: localhost
Порт: не указан
База данных: mysql
Префикс: d7__
Сторонних таблиц нет.

В этом случае настройки для settings.php будут следующими:

$databases = array (
  'default' => 
  array (
    'default' => 
    array (
      'database' => 'drupal7',
      'username' => 'root',
      'password' => 'root',
      'host' => 'localhost',
      'port' => '',
      'driver' => 'mysql',
      'prefix' => 'dr7__',
    ),
  ),
);

И запрос к базе данных:

$r = db_select('users', 'u')
	->fields('u')
	->condition('uid', 1)
	->execute()
;
print_r( $r->fetchAssoc());

Пример 2:

Исходные данные:

Drupal 7 установлен в одну базу данных (параметры те же).

Есть дополнительные (не Друпаловские таблицы) в той же базе данных.
prefix1__koni
prefix1__poni
prefix2__zebry

В этом случае настройки для settings.php будут следующими:

$databases = array (
  'default' => array (
    'default' => array (
      'database' => 'drupal7',
      'username' => 'user',
      'password' => 'password',
      'host' => 'localhost',
      'port' => '',
      'driver' => 'mysql',
      'prefix' => array(
	    'default' => 'dr7__',
	    'koni' => 'prefix1__',
	    'poni' => 'prefix1__',
	    'zebry' => 'prefix2__',
	  ),
    ),
  ),
);

Обращение к таблицам:

$r = db_select('koni', 'k')
	->fields('k')
	->execute()
;
print_r( $r->fetchAssoc());

$r = db_select('poni', 'p')
	->fields('p')
	->execute()
;
print_r( $r->fetchAssoc());

$r = db_select('zebry', 'z')
	->fields('z')
	->execute()
;
print_r( $r->fetchAssoc());

Пример 3:

Исходные данные:

Drupal 7 установлен в одну базу данных (параметры те же).

Есть таблица users (например от форума PHPBB). Т.е. имеем конфликт имен между users и dr7__users.
=/
Хорошо, если мы можем просто переименовать таблицу, зная что больше никто не читает и на записывает.
Но! если используется?

и тут обращаемся к представлениям (View) в MySQL.
Выполняем следующий код в phpMyAdmin:

CREATE VIEW `drupal7`.`users2` AS SELECT * FROM users;
CREATE VIEW `drupal7`.`users3` AS SELECT * FROM db2.users;

Теперь у нас есть представление основанное на таблице `users`. И настраиваем доступ следующим образом:

$databases = array (
  'default' => 
  array (
    'default' => 
    array (
      'database' => 'drupal7',
      'username' => 'root',
      'password' => 'root',
      'host' => 'localhost',
      'port' => '',
      'driver' => 'mysql',
      'prefix' => array(
	    'default' => 'dr7__',
	    'users2' => '',
	  ),	  
    ),
  ),
);

и запросы:

$r = db_select('users2', 'u')
	->fields('u')
	->execute()
;
print_r( $r->fetchAssoc());

Пример 4:

Исходные данные:

Drupal 7 установлен в одну базу данных (параметры те же).
Есть дополнительные (не Друпаловские таблицы) в другой базе данных.
db2.gr__makaroni
db2.gr__peperoni
db2.hren
db2.users

Обратите внимание, что у таблиц db2.hren и db2.users нет префикса, а таблиц db2.gr__makaroni и db2.gr__peperoni - есть.

Вариант 4-1:

случай когда доступ к db2 будет аналогичен доступу к drupal7.

Для таблицы `users` создаем представление:

CREATE VIEW `drupal7`.`users3` AS SELECT * FROM db2.users;

В этом случае настройки для settings.php будут следующими:

$databases = array (
  'default' => array (
    'default' => array (
      'database' => 'drupal7',
      'username' => 'user',
      'password' => 'password',
      'host' => 'localhost',
      'port' => '',
      'driver' => 'mysql',
      'prefix' => array(
	    'default' => 'dr7__',
	    'makaroni' => 'db2.gr__',
	    'peperoni' => 'db2.gr__',
	    'hren' => 'db2.',
	    'users3' => '',
      ),
    ),
  ),
);

Примеры запросов:

$r = db_select('makaroni', 'm')
	->fields('m')
	->execute()
;
print_r( $r->fetchAssoc());

$r = db_select('peperoni', 'p')
	->fields('p')
	->execute()
;
print_r( $r->fetchAssoc());

$r = db_select('hren', 'h')
	->fields('h')
	->execute()
;
print_r( $r->fetchAssoc());

$r = db_select('users3', 'u')
	->fields('u')
	->execute()
;
print_r( $r->fetchAssoc());

Вариант 4-2:

Случай когда доступ к db2 будет отличным от drupal7.

В этом варианте создавать представление не нужно.

И настройки для settings.php будут следующими:

$databases = array (
  'default' => 
  array (
    'default' => 
    array (
      'database' => 'drupal7',
      'username' => 'root',
      'password' => 'root',
      'host' => 'localhost',
      'port' => '',
      'driver' => 'mysql',
      'prefix' => 'dr7__',
    ),
  ),
  'extra' => 
  array (
    'default' => 
    array (
      'database' => 'db2',
      'username' => 'root2',
      'password' => 'root2',
      'host' => 'localhost',
      'port' => '',
      'driver' => 'mysql',
      'prefix' => array(
	    'default' => 'gr__',
	    'hren' => '',
	    'users' => '',
	  ),	  
    ),
  ),
);

Примеры запросов:

db_set_active('extra');
$r = db_select('makaroni', 'm')
	->fields('m')
	->execute()
;
print_r( $r->fetchAssoc());

$r = db_select('peperoni', 'p')
	->fields('p')
	->execute()
;
print_r( $r->fetchAssoc());

$r = db_select('hren', 'h')
	->fields('h')
	->execute()
;
print_r( $r->fetchAssoc());

$r = db_select('users', 'u')
	->fields('u')
	->execute()
;
print_r( $r->fetchAssoc());
db_set_active();

Пример 5:

Исходные данные:

  • Drupal 7 установлен в одну базу данных (параметры те же).
  • Есть дополнительные (не Друпаловские таблицы) в той же базе данных.
    • `prefix1__koni`
    • `prefix1__poni`
    • `prefix2__zebry`
  • Есть таблица `users` в базе с Drupal.
  • Есть дополнительные (не Друпаловские таблицы) в другой базе данных (db2)
    • db2.gr__makaroni
    • db2.gr__peperoni
    • db2.hren
    • db2.users
  • Доступ к базам drupal7 и db2 одинаковый.

Задача: обратится одним запросом ко всем таблицам и объединить.

$databases = array (
  'default' => 
  array (
    'default' => 
    array (
      'database' => 'drupal7',
      'username' => 'root',
      'password' => 'root',
      'host' => 'localhost',
      'port' => '',
      'driver' => 'mysql',
      'prefix' => array(
	    'default' => 'dr7__',
	    'koni' => 'prefix1__',
	    'poni' => 'prefix1__',
	    'zebry' => 'prefix2__',
	    'users2' => '',
	    'makaroni' => 'db2.gr__',
	    'peperoni' => 'db2.gr__',
	    'hren' => 'db2.',
	    'users3' => '',
	  ),	  
    ),
  ),
);

Примеры запросов:

//	классический пример с прямым обращением к базе и таблице
$r = db_query('
	SELECT
		*
	FROM
		{users},
		{koni},
		{poni},
		{zebry},
		users,
		db2.gr__makaroni,
		db2.gr__peperoni,
		db2.hren,
		db2.users
	');
print_r( $r->fetchAssoc());


//	обращение по краткому имени указанному в settings.php
$r = db_query('
	SELECT
		*
	FROM
		{users},
		{koni},
		{poni},
		{zebry},
		{users2},
		{makaroni},
		{peperoni},
		{hren},
		{users3}
	');
print_r( $r->fetchAssoc());


//	собствеено классика Drupal 7
$r = db_select('users', 'u');
$r->addJoin('CROSS', 'koni', 'k');
$r->addJoin('CROSS', 'poni', 'p');
$r->addJoin('CROSS', 'zebry', 'z');
$r->addJoin('CROSS', 'users2', 'u2');
$r->addJoin('CROSS', 'makaroni', 'm');
$r->addJoin('CROSS', 'peperoni', 'p2');
$r->addJoin('CROSS', 'hren', 'h');
$r->addJoin('CROSS', 'users3', 'u3');
$r
	->fields('u')
	->fields('k')
	->fields('p')
	->fields('z')
	->fields('u2')
	->fields('m')
	->fields('p2')
	->fields('h')
	->fields('u3')
;
print_r( $r->execute()->fetchAssoc());