!!!データベースにアクセスするモジュールの作成 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するだけの処理)。 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」を置いておきました。 参考までにご利用くださいませ。 {{ref xoops_DBAccessModule_20051108.zip}}