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