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: Connecting to an external database

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


Защитный код
Обновить



Кто на сайте
Сейчас 108 гостей онлайн