Drupal и MSSQL

Главные вкладки

Аватар пользователя naTureX naTureX 19 марта 2010 в 14:08

Здраствуйте.
Пишу отдельный модуль для drupal по дислокации вагонов. Возникла необходимость брать данные из БД MSSQL.В качестве средств разработки использую пакет денвер (связка PHP, Apache, MySQL). Как нужно настроить drupal чтобы была возможность делать выборку из БД MS SQL и выводить их на сайте. Схема следующая есть drupal со своей MySQL базой, я из своего модуля делаю запрос к локальной базе MS SQL и вывожу данные на сайт , в виде таблички например.

Комментарии

Аватар пользователя naTureX naTureX 19 марта 2010 в 14:39

насколько я понял ваше решение Stutzer@drupal.org:

- Найти утилиту для конверта БД MS SQL в MySQL
- потом с помощью db_set_active переключаться между базами и выводить данные так?

Вопрос в том, что в книге "CMS Drupal Руководство по разработке системы управления сайтом (авт. Джон Вандюк)", описывается следующее можно сделать запросы к разным базам с помощью db_set_active

но для этого нужно чтобы базы были однотипные т.е. , MySQL_DB_1 и MySQL_DB_2
есть решение для MySQL и PostgreSQL
нет ли чего то подобного для MSSQL

в кодах:
в файле settings.php находим строку $db_url['default'] = 'mysql://user:password@localhost/db_name';
меняем это на след.

<?php
$db_url 
= array(
  
'default' => 'mysql://user:password@localhost/db_name';
  
'ms_sql' =>  'mssql://user:password@localhost/db_name'// можно ли так сделать:?
);
?>

А потом обращаться к БД MS SQL из кода модуля по db_query???

Аватар пользователя Stutzer@drupal.org Stutzer@drupal.org 19 марта 2010 в 18:25

naTureX wrote:
насколько я понял ваше решение Stutzer@drupal.org:

- Найти утилиту для конверта БД MS SQL в MySQL
- потом с помощью db_set_active переключаться между базами и выводить данные так?

...
но для этого нужно чтобы базы были однотипные т.е. , MySQL_DB_1 и MySQL_DB_2

C чего вы взяли, что обе базы должны быть однотипными?

Если взглянуть на исходник db_set_active, ясно видно, что эта функция определяет типа БД и использует для работы с этой БД соответствующий драйвер (который необходимо написать или найти).

Так что ничего конвертировать не нужно.

Аватар пользователя naTureX naTureX 19 марта 2010 в 20:49

to: Stutzer@drupal.org

C чего вы взяли, что обе базы должны быть однотипными?

Просто так в книге написано, а в исходники я пока ещё ни разу не лазил, только недавно drupal поставил и с CMS до этого дела не имел.

ПРо xml-rpc вообще не понял ничего честно =).

Аватар пользователя naTureX naTureX 21 марта 2010 в 20:28

Всё-таки есть ли у кого-нибудь подобный опыт, может кто написать рабочий пример как сделать запрос к mssql и вывести данные в браузер. Буду очень признателен спасибо.

Аватар пользователя Stutzer@drupal.org Stutzer@drupal.org 21 марта 2010 в 23:24

Все же вроде разжевали. Для переключения меду разными БД существует [ru-api=db_set_active]db_set_active[/ru-api]
Для работы с любой СУБД друпал может использовать db abstract layer (уровень абстракции), который реализуется с помощью драйвера базы данных (файлы вида database.[тип_СУБД].inc, лежат в папке includes). Берете существующий файл (например тот, что для Посгрес) и на основе него пишите драйвер для работы с MSSQL (или ищите в этих ваших Интернетах).

5 минут гугления и мы имеем:
http://drupal.org/node/100568
http://www.drupal.ru/node/6896

Аватар пользователя olk olk 31 марта 2010 в 10:08

В принципе, если нужна просто какая нибудь выборка из базы, то с MSSQL DBLayer-ом можно не заморачиваться.
Просто в своем модуле, описываете полностью функционал ...
вот из моего старого проекта реальный кусок кода:
(Естественно должны быть подключены соответствующие библиотеки PHP (pdo, pdo_dblib)

<?php
function _mr_db_error_page($error '') {
  
drupal_init_language();
  
drupal_maintenance_theme();
  
drupal_set_header('HTTP/1.1 503 Service Unavailable');
  
drupal_set_title('Site off-line');
  
$message '<p>The site is currently not available due to technical problems. Please try again later. Thank you for your understanding.</p>';
  if (
$error && ini_get('display_errors')) {
    
$message .= '<p><small>The 'theme('placeholder''MSSQL') .' error was: 'theme('placeholder'$error) .'.</small></p>';
  }
  print 
theme('maintenance_page'$message);
  exit;
}

function 

mr_db_init(){
 global 
$mr_connect;
 
$mr_connect=mr_db_connect();
 return 
$mr_connect;
}

function 

mr_db_connect(){
 global 
$mr_connect;
 if (isset(
$mr_connect)) return $mr_connect;
 
$web_pass 'xxxxxxxxx';
 
$web_user 'xxxxxxxxx';

 try {
 

$mr_connect = new PDO('dblib:host=xxxxx;dbname=xxxxx',$web_user,$web_pass);
 
$mr_connect->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);
 } 
 catch (
PDOException $e) {
   
_mr_db_error_page($e->getMessage());
   return 
FALSE;
 }
 return 
$mr_connect;
}

function 

mr_db_getusers(){
 global 
$mr_connect;
 if(!isset(
$mr_connect)){
     
$mr_connect=mr_db_init();
 }
 
$users = array();
 
$sql 'exec P$_cmk_web_getUsers';
 foreach (
$mr_connect->query($sql) as $row)
 {
  
$users[$row['id']]=array(
  
'id' => $row['id'],
  
'idfirms' => $row['idfirms'],
  
'idotdel' => $row['idotdel'],
  
'pass' => iconv('CP1251','UTF-8',$row['pass']),
  
'username' => iconv('CP1251','UTF-8',$row['username']),
  
'email' => $row['email']
  );
 }
return 
$users;
}
?>