連接到外部資料庫
From Joomla! Documentation
如果您要存取同樣位於 Joomla! 安裝資料庫內的資料表,那您只需要使用JFactory->getDbo method。這個作法會利用 Joomla! 原本就建立的連線。例如:
<?php
$db = JFactory::getDbo();
?>
這樣 $db 就會是 type JDatabaseDriver 的物件,您可以使用例行的 method 來進行資料庫操作。
但如果您想要連接到完全部一樣的資料庫呢?有可能是和 Joomla!資料庫伺服器相同的主機上,或甚至是不同的主機磁碟上。好的,您需要使用 JDatabaseDriver->getInstance method。
<?php
$option = array(); //prevent problems
$option['driver'] = 'mysql'; // Database driver name
$option['host'] = 'db.myhost.com'; // Database host name
$option['user'] = 'fredbloggs'; // User for database authentication
$option['password'] = 's9(39s£h[%dkFd'; // Password for database authentication
$option['database'] = 'bigdatabase'; // Database name
$option['prefix'] = 'abc_'; // Database prefix (may be empty)
$db = JDatabaseDriver::getInstance( $option );
?>
這樣 $db 就會是 type JDatabaseDriver 的物件,您可以使用例行的 method 來進行資料庫操作。
值得注意的是,如果這個資料庫使用非標準連接埠,那需要在 host name 後面來指定。例如,MySQL使用3307埠 (預設是 3306埠),您的 host name要設定為 'db.myhost.com:3307'。
JDatabaseDriver->getInstance 的功能之一是,如果另一個呼叫使用相同參數來發動,它會回傳前一個建立的,而不是新建立的那一個。
然而,請注意,需要完全相符的參數才能實現,例如,如果有兩個呼叫對 MySQL 資料庫使用JDatabaseDriver->getInstance,頭一個使用host name of 'db.myhost.com',第二個使用'db.myhost.com:3306';那麼會成功建立兩個不同的連線。雖然 3306 埠是MySQL的預設通訊埠。所以 and so the parameters are logically the same.
如果您想要在分頁之類的情境使用 JModelLegacy,您可以使用不同的方法。重點是,您需要使用JModelLegacy->setDbo,取代標準的資料庫物件連結到 Joomla! 背景。第一步驟是在model檔案中,覆寫您的JModelLegacy 結構。
public function __construct($config = array())
{
parent::__construct($config);
$option = array(); //prevent problems
$option['driver'] = 'mysql'; // Database driver name
$option['host'] = 'localhost'; // Database host name
$option['user'] = 'myusername'; // User for database authentication
$option['password'] = 'saltedpassword'; // Password for database authentication
$option['database'] = 'db_extern'; // Database name
$option['prefix'] = ''; // Database prefix (may be empty)
$db = JDatabaseDriver::getInstance( $option );
parent::setDbo($db);
}
After that JModelLegacy behaves normal but uses your database.