トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

外部データベースへのアクセス_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.