!!!外部データベースへのアクセス XOOPSの管理下のデータベース(デフォルトではxoops)にアクセスする場合は、 比較的手間はかからなかったのですが、XOOPS上でそれ以外のデータベースにアクセス したい場合、または別サーバ上のデータベースにアクセスしたい場合は 少し作業が増えます。 「[[PEAR|PEAR_PHP]]」を使ったXOOPSでの外部データベースへのアクセス例です。 「[[データベースにアクセスするモジュールの作成|データベースにアクセスするモジュールの作成_XOOPS]]」でのサンプルソース「view.php」を以下のように置き換えています。 \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|PEAR_PHP]]」にあるように 普通の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!!
\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を元に戻す、と簡潔にアクセスできるように するほうが安定します。