データベースにアクセスするモジュールの作成_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の記述は不要です。
以下のようなテーブル内容が生成されることになります。
id | name | state |
---|---|---|
1 | dog | busy |
2 | cat | free |
3 | rabbit | sleep |
これだけではモジュールにテーブル(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」を置いておきました。参考までにご利用くださいませ。
Future's Laboratory 技術格納庫 2004-2013 Yutaka Yoshisaka.