Здраствуйте.
Пишу отдельный модуль для drupal по дислокации вагонов. Возникла необходимость брать данные из БД MSSQL.В качестве средств разработки использую пакет денвер (связка PHP, Apache, MySQL). Как нужно настроить drupal чтобы была возможность делать выборку из БД MS SQL и выводить их на сайте. Схема следующая есть drupal со своей MySQL базой, я из своего модуля делаю запрос к локальной базе MS SQL и вывожу данные на сайт , в виде таблички например.
Комментарии
db_set_active
+
написать или нагуглить DB Layout для MSSQL
насколько я понял ваше решение 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???
C чего вы взяли, что обе базы должны быть однотипными?
Если взглянуть на исходник db_set_active, ясно видно, что эта функция определяет типа БД и использует для работы с этой БД соответствующий драйвер (который необходимо написать или найти).
Так что ничего конвертировать не нужно.
Stutzer@drupal.org-- оплати ак проф. чо забыл да?
А не проще ли сделать xml-rpc запросы и написать прослойку маленькую, тем более в друпал это заложено.
to: Stutzer@drupal.org
C чего вы взяли, что обе базы должны быть однотипными?
Просто так в книге написано, а в исходники я пока ещё ни разу не лазил, только недавно drupal поставил и с CMS до этого дела не имел.
ПРо xml-rpc вообще не понял ничего честно =).
Всё-таки есть ли у кого-нибудь подобный опыт, может кто написать рабочий пример как сделать запрос к mssql и вывести данные в браузер. Буду очень признателен спасибо.
Все же вроде разжевали. Для переключения меду разными БД существует [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
naTureX ну как, получилось у вас?
В принципе, если нужна просто какая нибудь выборка из базы, то с 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_ERRMODE, PDO::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;
}?>
Читал тут
http://drupal.org/node/100568
http://www.drupal.ru/node/6896
показалось очень сложным,временно пока скачал конвертер и конвертнул базу в MySQL, и теперь работаю с ней. Всем спасибо.