ここは以前の ethna.jp サイトを表示したものです。ここにあるドキュメントはバージョン2.6以降更新されません。
最新のドキュメントは 現在のethna.jp を閲覧してください。現ドキュメントが整備されるまでは、ここを閲覧してください。
Ethna > ドキュメント > 開発マニュアル > データベースアクセス

データベースアクセス

この部分、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
    );
  3. 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);