外部データベースへのアクセス_XOOPS
外部データベースへのアクセス
XOOPSの管理下のデータベース(デフォルトではxoops)にアクセスする場合は、比較的手間はかからなかったのですが、XOOPS上でそれ以外のデータベースにアクセスしたい場合、または別サーバ上のデータベースにアクセスしたい場合は少し作業が増えます。
「PEAR」を使ったXOOPSでの外部データベースへのアクセス例です。「データベースにアクセスするモジュールの作成」でのサンプルソース「view.php」を以下のように置き換えています。
<?php // ヘッダファイルの参照 require('header.php'); // PEARのデータベース接続クラス require('DB.php'); // テンプレートの設定 $xoopsOption['template_main'] = 'dbaccessmodule_view.html'; // XOOPSヘッダの設定 include(XOOPS_ROOT_PATH.'/header.php'); // データベース[testDB]に接続 $dbUser = 'user1'; $dbPass = 'hoehoe'; $dbHost = 'localhost'; $dbName = 'testDB'; $db = DB::connect("mysql://$dbUser:$dbPass@$dbHost/$dbName"); if(DB::isError($db)) { exit("database connect Error!!<br>\n"); } //----------------------------------------------// // テンプレートにデータを設定する // //----------------------------------------------// $xoopsTpl->assign('lang_title', _MD_TITLE); $xoopsTpl->assign('lang_id', _MD_ID); $xoopsTpl->assign('lang_name', _MD_NAME); $xoopsTpl->assign('lang_state', _MD_STATE); //----------------------------------------------// // データベースへのアクセス // //----------------------------------------------// // クエリの発行(テーブル名 testtbl) $result = $db->query("select * from testtbl"); if($result) { while($row = $result->fetchRow()) { $xoopsTpl->append('data_list', array($row[0], $row[1], $row[2])); } } // データベースの切断 $db->disconnect(); // XOOPS用データベース接続を元に戻す $xoopsDB =& Database::getInstance(); // XOOPSフッタの設定 include(XOOPS_ROOT_PATH.'/footer.php'); ?>
まず、ヘッダの呼び出しの後に
require('DB.php');
を入れて、PEARのデータベースアクセスが使えるようにします。PEARを使ったデータベースアクセスとしては「PEAR」にあるように普通のPHPでのデータベースアクセス同じことをしています。
ただし、XOOPSの場合はデータベースにアクセスする順番に注意してください。以下のように、XOOPSヘッダのincludeを呼んだ後にデータベースに接続します。
// XOOPSヘッダの設定 include(XOOPS_ROOT_PATH.'/header.php'); // データベースに接続 $db = DB::connect("mysql://$dbUser:$dbPass@$dbHost/$dbName"); if(DB::isError($db)) { exit("database connect Error!!<br>\n"); }
順番を間違えると(たとえばXOOPSヘッダを呼ぶ前にデータベースをconnectする)、Warningが表示されることがあります。その後のデータベースへのアクセス処理はXOOPSフッタを呼ぶまでの間でいつでも行って大丈夫です。
XOOPSフッタを呼ぶ前に、disconnectで閉じています。
// データベースの切断 $db->disconnect(); // XOOPS用データベース接続を元に戻す $xoopsDB =& Database::getInstance(); // XOOPSフッタの設定 include(XOOPS_ROOT_PATH.'/footer.php');
その後の「$xoopsDB =& Database::getInstance();」が重要です。この外部データベースへのアクセスは「XOOPSの世界で使っているデータベースからちょっと離れて、外部にちょっかいを出しにいってる」わけですので、実際は正しい処理をしているとは言いがたいです。XOOPSに処理を渡すときには、「$xoopsDB =& Database::getInstance();」を呼んでXOOPSのデータベース接続を元状態に復帰してあげないと、その後のXOOPSの処理ができなくなってしまいます。必ずdisconnectで外部データベースを閉じた後にこれを呼ぶようにしてください。
あまり、接続・切断を繰り返すとレスポンスの問題もそうですが、XOOPSの動作が不安定になることがあります。ページを表示するはじめの方でconnectして、一番最後にdisconnectする、と徹底したほうがいいと思われます。
XOOPSデータベース内だけで簡潔していると、こんなのは気にしなくてもいいのに、と思われると思います。何のために外部にアクセスする必要があるのか、というというと、
- XOOPS以外の別システム(もしくは別サーバ)と連携をとりたい場合
- XOOPSのバージョンアップに影響されないように、データベースは分離しておきたい場合
- 関連するデータベースだけバックアップしやすくしたい場合
が可能性として考えられます。
その他、XOOPSで外部データベースにアクセスする場合の注意点・Tipsを書いておきます。
外部データベースアクセスを行う場合の注意点
XOOPS内のデータベースアクセスと外部データベースを混在させたい場合
この場合は、外部データベースをconnectする前に 先にXOOPSデータベースの情報を取ってきておきます(ログインユーザ情報など)。以降で外部データベースのconnectを行い、disconnectを行うまではXOOPSデータベースのアクセスは行わないようにします(というか、行えません)。
大事な点としては、XOOPSデータベースでのアクセスと外部データベースへのアクセスは別個に行う、ということです。やむ終えず、外部データベースアクセス中にXOOPSデータベースを見る必要がある場合は、
$db->disconnect(); $xoopsDB =& Database::getInstance();
として、外部データベースを閉じてXOOPSデータベースを復帰させてから XOOPSデータベース内の情報にアクセス、その後再び外部データベースに戻す、とするといいかもしれません。
何回も外部データベースを開いた閉じたりしない
connect-disconnectを1ページを表示するまでの間に何回も行うと、ページが表示されなくなったりエラーが出たりすることがあります。ページ内の作業をする前に外部データベースを開く、最後のXOOPSフッタに処理を渡す前にデータベースを閉じて$xoopsDBを元に戻す、と簡潔にアクセスできるようにするほうが安定します。
Future's Laboratory 技術格納庫 2004-2013 Yutaka Yoshisaka.