- 一番簡単なやり方(PEAR::DBを使う)
- PEAR::DB 以外のDBアクセスライブラリを使う
- 複数のDBオブジェクトを扱う場合
- リードオンリーのDBを複数台設定したい場合
- AppManager内でのDBオブジェクトの使用方法
この部分、Randolph@IRCが、fujimotoさんに頂いたメールを元にして書いてます。
-
etc/[appid]-ini.phpにdsn定義を行う。
$config = array( 'debug' => false, 'dsn' => 'mysql://user:pass@unix+localhost/dbname', );
-
Ethna_Backend::getDBメソッドを利用してDBオブジェクトを取り出す。
function perform() { $db =& $this->backend->getDB(); // ... return 'index'; }
Ethnaの デフォルトの DB接続クラス( Ethna_DB_PEAR) はPEAR::DBを継承しているので、
$sql = "SELECT id FROM test";
$result =& $db->query($sql);
$i = 0;
while ($data[$i] = $result->fetchRow()) {
$i++;
}
こんな感じでQueryを実行して、データ取得。
Ethna では、デフォルトの PEAR::DB の他に、 ADODB 及び Creole の クラスが同梱されています。
それぞれのライブラリをインストールしてあれば、あとはちょっとした変更を加えるだけで、上記の PEAR::DB とほぼ同じように利用することができます。
ADODB についての詳細は、下記をご覧下さい。
see also: ADODB を Ethna で使う
-
iniファイルに「dsn_(接続名)」でエントリを追加
'dsn_r' => 'mysql://user:pass@unix+localhost/dbname',
-
[appid]_Controller.phpに
/**
- @var array DBアクセス定義 */ var $db = array( '' => DB_TYPE_RW, );
って部分があるので、ここに使いたいDBオブジェクト名を追加。
/**
* @var array DBアクセス定義
*/
var $db = array(
'' => DB_TYPE_RW,
'r' => DB_TYPE_RO, // READ ONLY
);
-
DBオブジェクト作成時に接続名を指定する。
// 今までどおりのDB接続 $db =& $this->backend->getDB(); // SELECT専用のDB接続 $db_r =& $this->backend->getDB('r'); // 引数が「r」になっている。
'dsn_r' => array(
'mysql://user:pass@unix+localhost/dbname1',
'mysql://user:pass@unix+localhost/dbname2',
);
上記のように、array形式で指定します。
$db_r =& $this->backend->getDB('r'); // 引数が「r」になっている。
ランダムで、dbname1とdbname2を割り振ってくれます。
Ethna_AppManagerのコンストラクタにより、既にDBオブジェクトは 取得されていますので、下記の様に操作する事が可能です。
$this->db->query("SELECT id FROM test");
// 上記「複数のDBオブジェクトを扱う場合」の(1)を行った場合の例
$this->db_r->query("SELECT id FROM test");
なお、上記方法で取得できるクラスはEthna_DB_PEARクラスです。 prepared statementなど、PEAR_DBの機能をフルに使うには、Ethna_DB_PEARクラスのメンバに直接アクセスする必要があります。
$sql = "SELECT id FROM test WHERE id = ?";
$data = array($id);
$stmt =& $this->db->db->prepare($sql);
$res =& $this->db->db->execute($stmt, $data);