本記事では、XOOPS Cube がウェブサイトにアクセスされた時どのようにしてデータベースサーバに接続しているかを順を追って解説します。
まず、 XOOPS Cube のモジュール等でデータベースを利用する際の標準的なコーディング手法を紹介します。以下の様なデータアクセス用のコードは通常、モジュールの class フォルダに配置され、コントローラから利用されます。
$root =& XCube_Root::getSingleton();
$db =& $root->mController->getDB();
$table = $db->prefix('foo');
$sql = "SELECT * FROM ". $table ." WHERE uid=$uid";
$result = $db->query($sql);
while ($row = $db->fetchArray($result)) {
$ret[] = $row;
}
return $ret;
なお、ここに掲示されるコードは XOOPS Cube Legacy 2.2.1 のコアソースから解説ポイントだけをピックアップした物ですので予めご了承ください。
最初に、html 直下の index.php が呼び出されます。そしてその中で mainfile.php が読み込まれます。さらに minfile.php の中で common.php を読み込みます。
include XOOPS_ROOT_PATH.'/include/common.php';
common.php では、コアの各種初期設定である cubecore_init.php を読み込み $root を作るという大事な役割をになっています。 XOOPS Cube では、全て $root からコントロール可能ですが、ここで生成されます。
require_once XOOPS_ROOT_PATH . '/include/cubecore_init.php';
$root=&XCube_Root::getSingleton();
$xoopsController=&$root->getController();
$xoopsController->executeCommon();
$root が生成された後そこに肉付けしていく作業が続きます。それが executeCommon です。まるで木の幹から枝が生えて行く様をみるかの様に以下のクラスが生成されます。各ライブラリの解説はまたいずれ行いますが、ここで注目して頂きたいのが $this->_setupDB(); です。ここでデータベースサーバへのコネクションが張られてプライマリとして使用するデータベースが決定します。
class Legacy_Controller extends XCube_Controller{
function executeCommon(){
$this->_setupEnvironment();
$this->_setupLogger();
$this->_setupDB();
$this->_setupLanguage();
$this->_setupTextFilter();
$this->_setupConfig();
$this->_setupScript();
$this->_setupDebugger();
$this->_loadInterfaceFiles();
$this->_processPreBlockFilter();
$this->_setupSession();
$this->_setupUser();
$this->setupModuleContext();
$this->_processModule();
$this->_processPostFilter();
}
function _setupDB(){
$this->mDB =& XoopsDatabaseFactory::getDatabaseConnection();
}
function &getDB(){
return $this->mDB;
}
}
_setupDB() では、getDatabaseConnection をコールして $root->mController->mDB に生成内容を渡します。さて、ではいよいよ MySQL サーバとの接続部分です。
getDatabaseConnection は databasefactory というクラスに用意されています。ここの connect で XOOPS_DB_TYPE に指定した種類のDBサーバ(=MySQL) のクラスライブラリがローディングされます。
public static function &getDatabaseConnection(){
$file = XOOPS_ROOT_PATH.'/class/database/'.XOOPS_DB_TYPE.'database.php';
$instance->connect();
}
そして、mysql_connect が実行され mysql_select_db でプライマリのデータベースが設定されます。
class XoopsMySQLDatabase extends XoopsDatabase
{
function connect($selectdb = true){
$this->conn = @mysql_connect(XOOPS_DB_HOST, XOOPS_DB_USER, XOOPS_DB_PASS, false, MYSQL_CLIENT_FOUND_ROWS);
mysql_select_db(XOOPS_DB_NAME);
}
}