Drupal → Как сделать запрос к другой базе данных

13.07.2010

Код создаёт блок с пятью последними сообщениями форума IPB, база которого называется ipb_base:

/**
 * Implements hook_block()
 */
function mymodule_block($op = 'list', $delta = 0, $edit = array()) {
  if ($op == 'list')  {
    $blocks[0]['info'] = 'Последние сообщения на форуме';
    return $blocks;
  }
  
  if ($op == 'view') {
    global $db_url;

    // параметры новой бд
    $ipb_db_url = 'mysqli://root:qwerty@localhost/ipb_base';

    if (is_array($db_url)) {
      $db_url += array('ipb' => $ipb_db_url);
    }
    else {
      $db_url = array('default' => $db_url, 'ipb' => $ipb_db_url);
    }
        
    // подключаемся к новой бд
    $prev_db = db_set_active('ipb');

    // делаем запрос
    $posts = db_query_range("SELECT author_name, post FROM `posts` ORDER BY pid DESC", 0, 5);

    // подключаемся к предыдущей бд
    db_set_active($prev_db);

    $items = array();
    while ($post = db_fetch_object($posts)) {
      $items[] = $post->author_name . ': ' . $post->post;
    }

    $block['subject'] = 'Последние сообщения на форуме';
    $block['content'] = theme('item_list', $items);
        
    return $block;
  }
}

Подробнее.

Написанное актуально для
Drupal 6.x
Похожие записи

Комментарии

Гость
10.09.2011, 23:46

И все-таки это проще сделать на стороне движка форума, а в блок Друпала включать только подключение скрипта.

не разумно подгружать ядро форума, только для того чтобы сделать запрос к бд

не факт, что до запроса была активна дефолтная

Игорь
26.03.2014, 10:49

После вашего коммента въехал в суть вопроса...)))
Я имел ввиду что записи равнозначны

db_set_active('default');
// и 
db_set_active();

И понял, что ваша запись более правильна, так как переключается назад на нужную базу,
$prev_db - Ключ ранее активной базы данных.

    $prev_db = db_set_active('ipb');
    db_set_active($prev_db);

Очень редко этим пользуюсь.

Алексей
25.12.2015, 11:57

Опять использую это для "перекачки" данных со старого сайта на новый. И опять проблема после получения данных с донора и возврате на дефолтную базу нового Drupal все ещё думает что он та старом и пытается использовать его архитектуру.

К примеру при попытке создать сущность, которая есть только на новом сайте, drupal делает вид, что не знает о чем идёт речь.

Может есть какая функция "сброса кеша". Чтобы drupal снова пересканировал базу и "вспомнил" сущности и конфиги нового сайта.

Алексей
25.12.2015, 20:55

Сам же и отвечу. Для Drupal 7

db_set_active('default');
drupal_static_reset();

xandeadx, это подключение работает для любой базы или только drupal? у меня есть сторонняя база с отзывами, надо из нее забрать каменты.

В семерке делаю так

function appozitiv_get_testimonial() {
//  База данных настраивается в settings.php
//$databases['appozitiv']['default'] = array(
//    'database' => 'del_appozitiv',
//    'username' => '', 
//    'password' => '', 
//    'host' => 'localhost', 
//    'driver' => 'mysql', 
//);

  db_set_active('appozitiv');
  $comments = db_select('comments', 'c')
    ->fields('c', array('id', 'text'))
    ->execute()
    ->fetchAll();
  dpm($comments);
  db_set_active();
}

получаю ошибку
PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'del_appozitiv.variable' doesn't exist: SELECT 1 AS expression FROM {variable} variable WHERE ( (name = :db_condition_placeholder_0) ); Array ( [:db_condition_placeholder_0] => cron_last ) in variable_set() (line 991 of includes/bootstrap.inc).

как правильно?

Алексей
27.08.2016, 19:08
dpm($comments);
drupal_static_reset();
db_set_active();

Попробуйте.

Добавить комментарий