使用法
MDB2 の Reverse ドライバを使用するには、まず Reverse
ドライバを MDB2 のインスタンスに読み込む必要があります。
まずは MDB2 のインスタンスを作成し、接続を確立しましょう。
<?php
// MDB2 基底クラスを読み込みます
require 'MDB2.php';
// データベースに接続するための DSN を定義します
$dsn = array(
'phptype' => 'mysql',
'username' => 'someuser',
'password' => 'somepass',
'hostspec' => 'somehost',
'database' => 'somedb',
);
// MDB2 インスタンスを作成します
// MDB2 にはいくつかの接続方法があります - singleton()、factory() そして connect() です
$mdb2 = &MDB2::connect($dsn);
if(PEAR::isError($mdb2)) {
// 何らかの理由で失敗した場合は、メッセージを表示して終了します
die($mdb2->getuserinfo());
}
// 正しく接続できたので、処理を進めましょう!
// MDB2 の loadModule メソッドで、Reverse モジュールを読み込みます
$mdb2->loadModule('Reverse', null, true);
?>
上の例では、既存のデータベースへの有効な接続を作成するために、
データベースサーバへの有効なユーザ名とパスワードを使用しています。
これで、サンプルアプリケーション内で MDB2 Reverse 機能のすべてを使用できるようになりました。
このドキュメントで使用するためのテーブルを、このように作成します。
<?php
// 操作するテーブルの名前を定義します
$fields = array(
'id' => array(
'type' => 'integer',
'unsigned' => true,
'autoincrement' => true,
),
'somename' => array(
'type' => 'text',
'length' => 12,
),
'somedate' => array(
'type' => 'date',
),
);
$table = 'sometable';
// テーブルの作成
// Manager モジュールを読み込みます
$mdb2->loadModule('Manager', null, true);
// Manager モジュールでテーブルを作成します
$mdb2->manager->createTable($table, $fields);
?>
getTableFieldDefinition() メソッド
getTableFieldDefinition() メソッドの目的は、
テーブルのフィールド定義情報を配列で取得することです。
この配列を使用すると、別の場所で同じテーブルを作成したり
その他必要に応じて使用できます。先ほど定義した MDB2 インスタンスを用いてデータベースに接続し、
対象となるテーブルを作成し、調べたい特定のフィールドをリバースエンジニアリングします。
まず、対象となるテーブルとフィールドを定義する必要があります。
そうすれば、たった一行コードを書くだけでテーブル定義を配列として取得できるようになります。
それから、var_dump で結果を表示しています。
<?php
// リバースエンジニアリング (定義の取得) を行いたいフィールドを設定します
$field = 'somedate';
// テーブルのフィールド定義を取得し、変数に保存します。
// 返り値は、成功した場合は配列、失敗した場合は MDB2 error となります。
// そこで、ここでは追加のチェックは必要ありません。
$def = $mdb2->getTableFieldDefinition($table, $field);
// 最後に結果を画面に出力します
var_dump($def);
?>
フィールド定義に依存しますが、返される結果は次のようになるでしょう。
<?php
array(1) {
[0] => array(5) {
['notnull'] => bool(false)
['nativetype'] => string(4) "date"
['default'] => NULL
['type'] => string(4) "date"
['mdb2type'] => string(4) "date"
}
}
?>
テーブルの付加情報
これ以外にもさまざまなメソッドがあり、選択したテーブルについての情報を取得することができます。
以下のメソッドのいずれかを、ほしい情報に応じて使用しましょう。
-
getTableIndexDefinition():
テーブル名とインデックス名を指定すると、
テーブルのインデックスについての情報を配列で返します。
-
getTableConstraintDefinition():
テーブル名を指定し、制約の情報を問い合わせます。
これは、指定したテーブル上のすべての制約の定義を返します。
ここで言う「制約」とは、通常は主キーやユニークキー、そして外部キーのことです。
返される配列の構造は、
Manager モジュール の
createConstraint()
で用いるものと同じです。
-
getSequenceDefinition():
シーケンス名を指定し、既存のテーブルのシーケンスについての情報を返します。
このメソッドは、成功した場合に配列、失敗した場合に MDB2 error を返します。
-
getTriggerDefinition():
トリガ名を引数として受け取り、そのトリガについての情報を配列で返します。
tableInfo() メソッド
このメソッドは、テーブルに関する多くの情報を返します。
さまざま場面で使用することができます。
返される情報の内容は RDBMS によって微妙に異なり、結果の形式も変わってきます。
このメソッドは、テーブル定義のほかに結果セットに対して使用することもできます。
これは、最適化されたテーブルを作る際に便利です。
tableInfo() メソッドのパラメータには、
結果をどのように表すかを指定するためのモードを渡すことができます。
結果がどのようになるのかをよりわかりやすくするため、
同じクエリを使用して結果を異なるモードで出力する一連の例をごらんいただきます。
注意: 最初のパラメータには、テーブルあるいは結果セットのいずれかを指定して情報を取得することができます。
これらの例では、先ほど定義したテーブルを使用します。
<?php
// デフォルトのモード - NULL
$tableInfo = $mdb2->tableInfo($table, NULL);
var_dump($tableInfo);
// 結果は、このようになります
array(3) {
[0] => array(11) {
['notnull'] => bool(true)
['nativetype'] => string(3) "int"
['length'] => int(4)
['unsigned'] => int(1)
['default'] => string(0) ""
['autoincrement'] => bool(true)
['type'] => string(3) "int"
['mdb2type'] => string(7) "integer"
['name'] => string(2) "id"
['table'] => string(9) "sometable"
['flags'] => string(29) "primary_key not_null unsigned"
}
[1] => array(10) {
['notnull'] => bool(false)
['nativetype'] => string(7) "varchar"
['length'] => string(2) "12"
['fixed'] => bool(false)
['default'] => NULL
['type'] => string(7) "varchar"
['mdb2type'] => string(4) "text"
['name'] => string(8) "somename"
['table'] => string(9) "sometable"
['flags'] => string(0) ""
}
[2] => array(8) {
['notnull'] => bool(false)
['nativetype'] => string(4) "date"
['default'] => NULL
['type'] => string(4) "date"
['mdb2type'] => string(4) "date"
['name'] => string(8) "somedate"
['table'] => string(9) "sometable"
['flags'] => string(0) ""
}
}
?>
これ以降の例では、最初のテーブルフィールドの定義のみを含めます。
モードごとの違いを示すには、それで十分だからです。
さあ、ではモードを MDB2_TABLEINFO_ORDER
に変更してみましょう。
デフォルトの出力で得られた情報に加えて、カラム数についての情報が
num_fields
要素で返されます。また、order
要素の配列の構造は、キーがカラム名、値がそのカラムのインデックス
(デフォルトの出力のキーに対応します) となります。
<?php
$tableInfo = $mdb2->tableInfo($table, MDB2_TABLEINFO_ORDER);
var_dump($tableInfo);
array(5) {
['num_fields'] => int(3)
[0] => array(11) {
['notnull'] => bool(true)
['nativetype'] => string(3) "int"
['length'] => int(4)
['unsigned'] => int(1)
['default'] => string(0) ""
['autoincrement'] => bool(true)
['type'] => string(3) "int"
['mdb2type'] => string(7) "integer"
['name'] => string(2) "id"
['table'] => string(9) "sometable"
['flags'] => string(29) "primary_key not_null unsigned"
}
[1] => array(10) {
['notnull'] => bool(false)
['nativetype'] => string(7) "varchar"
['length'] => string(2) "12"
['fixed'] => bool(false)
['default'] => NULL
['type'] => string(7) "varchar"
['mdb2type'] => string(4) "text"
['name'] => string(8) "somename"
['table'] => string(9) "sometable"
['flags'] => string(0) ""
}
[2] => array(8) {
['notnull'] => bool(false)
['nativetype'] => string(4) "date"
['default'] => NULL
['type'] => string(4) "date"
['mdb2type'] => string(4) "date"
['name'] => string(8) "somedate"
['table'] => string(9) "sometable"
['flags'] => string(0) ""
}
['order'] => array(3) {
['id'] => int(0)
['somename'] => int(1)
['somedate'] => int(2)
}
}
?>
モードを MDB2_TABLEINFO_ORDERTABLE
に変更すると、
さらに情報が追加されます。返り値の配列の次元数がひとつ多くなり、
テーブル名をキー、そのフィールド名をサブキーとする構成になります。
この型のクエリが有用なのは、たとえば複雑な結合を行っており、
同名のフィールドが複数ある場合などです。
注意: flags
要素には、フィールドに関する付加情報が
スペース区切りの一覧で含まれます。この内容には、DBMS 間での一貫性はありません。
それぞれの DBMS に依存し、次のような内容になります。
primary_key
unique_key
multiple_key
not_null
unsigned
大半の DBMS では、結果がテーブル名の場合は
table
および
flags
しか返しません。
オプション
portability
が
MDB2_PORTABILITY_FIX_CASE
に設定されている場合は、テーブルおよびフィールドの名前は小文字あるいは大文字に変換されます。
CASE_UPPER
の場合は、すべてのテーブルおよびフィールドは大文字に変換されます。
これは Oracle や Firebird/Interbase と同じ挙動です。一方、
CASE_LOWER
の場合はすべてのテーブルおよびフィールドを小文字に変換します。
これがデフォルトの設定です。