Joomla: Подключение к внешней базе данных

Joomla: Подключение к внешней базе данных

Если вам необходимо получить доступ к таблицам базы данных, из расширения Joomla, то вы можете просто использовать метод JFactory->getDBO() При этом используется уже установленное соединение, то что Joomla использует для подключения к базе данных.

Например:

 

<?php

$db = JFactory::getDBO();

?>

Теперь переменная $db — это есть объект типа JDatabase и мы можем производить необходимые действия с базой данных, используя методы, входящие в его интерфейс: JDatabase class.

Но, что если вам нужно работать с другой базой данных, отличной от той, что прописывалась вами при установке и указана в конфиге? Или ваше расширение использует несколько баз данных (бывает и такое), причём на разных хостах, и с разными префиксами ? А может вам нужно работать вообще с разными драйверами? Тогда вам нужна универсальная чудо-хреновина! Только сегодня! По баснословно низкой цене! Всего 999.99 … — Шутка :)! Вам нужно будет использовать метод JDatabase->getInstance()

 

<?php

$option = array(); //Инициализация

  

$option['driver']   = 'mysql';            // Имя драйвера БД

$option['host']     = 'db.myhost.com';    // Хост БД

$option['user']     = 'fredbloggs';       // Имя пользователя

$option['password'] = 's9(39s£h[%dkFd';   // Пароль

$option['database'] = 'bigdatabase';      // Имя БД

$option['prefix']   = 'jos_';             // префикс (может быть пустым)

  

$db = & JDatabase::getInstance( $option );

?>

Теперь переменная $db — это опять же объект типа JDatabase со всеми вытекающими. Заметим, что если база данных использует нестандартный номер порта, то порт можно указать, путем добавления его в конце имени хоста. Например, если MySQL работает на порту 3307 (по умолчанию используется порт 3306), в этом случае имя хоста может иметь вид "db.myhost.com: 3307".

Одной из особенностей использования JDatabase->getInstance(), является то, что если вы попытаетесь создать ещё один объект соединения с тем же параметрами, с какими уже создавали объект ранее — она вернет ранее созданный объект, а не создаст новый. То есть JDatabase->getInstance() — реализует идею Singlton Однако, что бы это произошло, параметры должны точно совпадать. Например, если два вызова были сделаны с использованием JDatabase->getInstance(), первый раз с использованием имени хоста "db.myhost.com", а второй с помощью "db.myhost.com: 3306", то это породит два разных объекта, хотя порт 3306 это порт MySQL по-умолчанию, и логически это то же самое. Я в сырцах не ковырялся, но похоже, что параметры там тупо сравниваются как строки.

Если вам нужно использовать JModel с постраничной навигацией и т.д. и т.п. И вам нужно заставить работать ваши модели с вашим новым соединением, а не с соединением по-умолчанию. То для этого потребуется использовать метод JDatabase->setDbo(). Собственно нужно будет переопределить конструктор JModel в вашем файле модели следующим образом:

 

<?php

    public function __construct($config = array())

    {

        parent::__construct($config);

     

        $option = array(); //Инициализация

     

        $option['driver']   = 'mysql';          // Имя драйвера БД

        $option['host']     = 'localhost';      // Хост БД

        $option['user']     = 'myusername';     // Имя пользователя

        $option['password'] = 'saltedpassword'; // Пароль

        $option['database'] = 'db_extern';      // Имя БД

        $option['prefix']   = '';               // префикс (может быть пустым)

     

        $db = & JDatabase::getInstance( $option );

        parent::setDbo($db);

    }

?>

Вуаля — теперь модель использует подсунутое ей, новое соединение.

 

Возможно Вас заинтересуют эти материалы

Joomla 1.5: Отправка почты.

В этой заметке рассказано о том, как отправлять почту, используя механизмы предоставленные Joomla 1.5 (

Joomla 1.5: Пагинация.

Класс JPagination, представленный в Joomla! 1.5, позволяет легко, и просто добавлять постраничную навигацию - пагинацию

Joomla 1.5: Система событий.

Joomla 1.5 имеет систему событий, основанную на реализации шаблона проектирования Observer. И эта система очень неплохо