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

データベースにアクセスするモジュールの作成_XOOPS

データベースにアクセスするモジュールの作成

XOOPSモジュールではデータベースのテーブルを自動で作成し、データを管理することができます。XOOPS管理下のデータベースにアクセスする場合は処理は非常に簡単になります。

外部データベースにアクセスする場合は少し複雑になります。「外部データベースへのアクセス」を参照してください。

データベーステーブルの作成

モジュールの[sql]ディレクトリがあり、ここに「mysql.sql」ファイルを置きます。中身は以下の内容とします。

[sql/mysql.sql]ファイル

create table test_tbl(
    id int auto_increment,
    name varchar(50) not null,
    state varchar(40),
    primary key(id)
);

# data
insert into test_tbl values('1','dog', 'busy');
insert into test_tbl values('2','cat', 'free');
insert into test_tbl values('3','rabbit', 'sleep');

「create table」にてテーブルを生成するSQL文を記述しています。テーブル項目として「id」「name」「state」の2つを設けます。「insert」文にて、初期段階で設定するレコードを記載しています。テーブルをまっさらの状態で作るだけなら、insertの記述は不要です。

以下のようなテーブル内容が生成されることになります。
idnamestate
1dogbusy
2catfree
3rabbitsleep

これだけではモジュールにテーブル(mysql.sqlの内容)が結びついていません。「xoops_version.php」にて以下の行を追加することにより、モジュールインストール時にデータベーステーブルが作成されることになります。

$modversion['sqlfile']['mysql'] = 'sql/mysql.sql';
$modversion['tables'][0] = 'test_tbl';

「$modversion['sqlfile']['mysql']」にて、モジュールインストール時に参照するsqlファイルを指定します。「$modversion['tables'][0]」に、作成するテーブル名を指定します。テーブル名は「mysql.sql」でcreate tableしているテーブル名を指定します。

複数のテーブルを生成する必要があるときは、

$modversion['tables'][0] = 'test_tbl';
$modversion['tables'][1] = 'test_tbl2';
$modversion['tables'][2] = 'test_tbl3';

のように0/1/2...と添え字をつけるようにします。

以上の状態でモジュールをとりあえずインストールするだけで、上記で指定したテーブルが作成されます。モジュールアップデート時はテーブルの生成処理・初期化処理は無視されますので、テーブル情報が変わる場合は一度モジュールをアンインストールしてから再度インストールしたほうがいいかもしれません。アンインストール時は、インストール時に自動的にcreate tableしたテーブルをdropします。

実際のMySQL上では、xoopsデータベース内に「xoops_」の接頭文字がついた状態のテーブルが生成されることになります。「test_tbl」をcreate tableしましたので、「xoops_test_tbl」テーブルが実テーブルとして存在することになります。

作成したデータベーステーブルにアクセス

XOOPSの管理下のデータベースへは「$xoopsDB」というグローバルなクラスにてアクセスすることが可能です。以降の処理はPHPソース内での記述となります。

SQL文の生成

$sql = 'select * from '.$xoopsDB->prefix('test_tbl');

とした場合、「$xoopsDB->prefix」は実データベースに渡すテーブル名(ここでは「xoops_test_tbl」)を求めます。結果、

$sql = 'select * from xoops_test_tbl';

を入れることになります。

クエリの実行(select)および結果の取り出し

if($result = $xoopsDB->query($sql)) {  // SQL文より問い合わせ実行
    while($row = $xoopsDB->fetchArray($result)) {  // 1レコードの情報を取得
        // テンプレートにデータを送る
        $xoopsTpl->append('data_list', array($row['id'], $row['name'], $row['state']));
    }
}

「$result = $xoopsDB->query($sql)」にて指定のSQL文を元にデータベースアクセスを行います。対象となるデータベースはXOOPSが使用している「xoops」データベースです。処理に失敗した場合は「$result」にnullが返ってきます。

「$row = $xoopsDB->fetchArray($result)」を繰り返すことにより、1レコードずつテーブルの情報を取得します。戻り値の「$row」ですが、これは一次元配列になっています。

$row['id']  ←  テーブル項目 id の値
$row['name']  ←  テーブル項目 name の値
$row['state']  ←  テーブル項目 state の値

のように、$rowの配列添え字には項目名を指定します。これにより、項目に対する値を取得しています。

以下の部分は、テンプレート上の「data_list」内に1レコードずつの情報を渡している部分です。

$xoopsTpl->append('data_list', array($row['id'], $row['name'], $row['state']));

PHPソース全体としては以下のようになります(単に生成されたテーブルをselectするだけの処理)。

<?php
    // ヘッダファイルの参照
    require('header.php');

    // テンプレートの設定
    $xoopsOption['template_main'] = 'dbaccessmodule_view.html';

    // XOOPSヘッダの設定
    include(XOOPS_ROOT_PATH.'/header.php');

    //----------------------------------------------//
    // テンプレートにデータを設定する               //
    //----------------------------------------------//
    $xoopsTpl->assign('lang_title', _MD_TITLE);
    $xoopsTpl->assign('lang_id', _MD_ID);
    $xoopsTpl->assign('lang_name', _MD_NAME);
    $xoopsTpl->assign('lang_state', _MD_STATE);

    //----------------------------------------------//
    // データベースへのアクセス                     //
    //----------------------------------------------//
    $sql = 'select * from '.$xoopsDB->prefix('test_tbl');
    if($result = $xoopsDB->query($sql)) {               // SQL文より問い合わせ実行
        while($row = $xoopsDB->fetchArray($result)) {   // 1レコードの情報を取得
            // テンプレートにデータを送る
            $xoopsTpl->append('data_list', array($row['id'], $row['name'], $row['state']));
        }
    }

    // XOOPSフッタの設定
    include(XOOPS_ROOT_PATH.'/footer.php');
?>

データベースにアクセスしてもしなくても、処理内容はあまり変わらないですね。つまり、データベースのアクセスは簡単にできる、ということでもあります。

クエリの実行(insert/update/delete)

selectの場合は「$xoopsDB->query($sql)」を使いましたが、insert/update/deleteのアクションを起こす場合は、「$xoopsDB->queryF($sql)」を使用します。

// insertの実行
$sql = 'insert into '.$xoopsDB->prefix('test_tbl').' set id=4,name=\'test\',state=\'normal\'';
$xoopsDB->queryF($sql);
// updateの実行
$sql = 'update '.$xoopsDB->prefix('test_tbl').' set name=\'てすと\',state=\'normal2\' where id=1';
$xoopsDB->queryF($sql);
// deleteの実行
$sql = 'delete from '.$xoopsDB->prefix('test_tbl').' where id=1';
$xoopsDB->queryF($sql);

現在のモジュールで使っているテーブル以外のテーブルにアクセス

なお、$xoopsDBを使うとモジュールで生成したテーブルだけでなく、それ以外のXOOPS管理下のテーブルにもアクセスすることができます。

例えば「$xoopsDB->prefix('users')」だと、xoopsデータベースの「xoops_users」テーブルにアクセスすることになります。

$sql = 'select uid,name,uname from '.$xoopsDB->prefix('users');
if($result = $xoopsDB->query($sql)) {  // SQL文より問い合わせ実行
    while($row = $xoopsDB->fetchArray($result)) {  // 1レコードの情報を取得
        $uid   = $row['uid'];
        $name  = $row['name'];
        $uname = $row['uname'];
    }
}

こうすると、ユーザIDとそれに対応するユーザ本名、ユーザの名を取得してくることができます。xoopsデータベース内の場合は、このように(普通のデータベースアクセスにあるような)connect〜disconnectでの開いて閉じる作業は不要になります。

サンプルモジュールのダウンロード

上記のデータベーステーブルを生成してインストール時にinsert処理を行い、それをテーブル表示するサンプル「DBAccessModule」を置いておきました。参考までにご利用くださいませ。

xoops_DBAccessModule_20051108.zip(193)

Future's Laboratory 技術格納庫 2004-2013 Yutaka Yoshisaka.