Ethna > ドキュメント > 開発マニュアル > データベースアクセス
データベースアクセス
この部分、Randolph@IRCが、fujimotoさんに頂いたメールを元にして書いてます。
一番簡単なやり方(PEAR::DBを使う)
- 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を実行して、データ取得。
PEAR::DB 以外のDBアクセスライブラリを使う
Ethna では、デフォルトの PEAR::DB の他に、ADODB 及び Creole の クラスが同梱されています。
それぞれのライブラリをインストールしてあれば、あとはちょっとした変更を加えるだけで、上記の PEAR::DB とほぼ同じように利用することができます。
ADODB についての詳細は、下記をご覧下さい。
see also: ADODB を Ethna で使う
複数のDBオブジェクトを扱う場合
- 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」になっている。
リードオンリーのDBを複数台設定したい場合
'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を割り振ってくれます。
AppManager内でのDBオブジェクトの使用方法
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);