目次

データベースアクセス

データベースアクセス

この部分、Randolph@IRCが、fujimotoさんに頂いたメールを元にして書いてます。

一番簡単なやり方(PEAR::DBを使う)

  1. etc/[appid]-ini.phpにdsn定義を行う。

    $config = array( 'debug' => false, 'dsn' => 'mysql://user:pass@unix+localhost/dbname', );

  2. 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オブジェクトを扱う場合

  1. iniファイルに「dsn_(接続名)」でエントリを追加

    'dsn_r' => 'mysql://user:pass@unix+localhost/dbname',

  2. [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
);
  1. 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);