xandeadx.ru Блог музицирующего веб-девелопера

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

Опубликовано в

Код создаёт блок с пятью последними сообщениями форума 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
Похожие записи

Комментарии RSS

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

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

А для 7-ки так правильно? http://prof-labs.ru/blog/drupal/163

# Переключаемся обратно на стандартную базу сайта
db_set_active();
Можно же просто без параметра переключиться на базу по умолчанию
https://api.drupal.org/api/drupal/includes!database!database.inc/function/db_set_active/7
Актуально для любой версии друпала.

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

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

db_set_active('default');
// и 
db_set_active();
И понял, что ваша запись более правильна, так как переключается назад на нужную базу,
$prev_db - Ключ ранее активной базы данных.
    $prev_db = db_set_active('ipb');
    db_set_active($prev_db);

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

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

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

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

Сам же и отвечу. Для 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).

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

dpm($comments);
drupal_static_reset();
db_set_active();

Попробуйте.

Алексей, спасибо! )

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании