連接到外部資料庫

From Joomla! Documentation

This page is a translated version of the page Connecting to an external database and the translation is 100% complete.

如果您要存取同樣位於 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.