いろいろ準備中

[Zend Framework] Zend_Db 基本

12月 17th, 2007 Posted in Zend Framework

PHPからDBにアクセスする部分を請け負うアダプタ(Zend_Db_Adapterを拡張したもの)は、PDOドライバに対応しているようですね。

MySQL 5.0 、PHP5.1以降を使っていたので、./configure時に –with-mysqliオプションを付けてPHPをインストールするだけで、Zend_Db_Adapter_Mysqliのアダプタが使えました(他の方法は上記PDOのリンクをご覧ください)。

$ ./configure --with-mysqli=/path/to/the/mysql_config (以下略)

基本的な使い方は以下の通りです。

アダプタの取得

$params = array( 'host'=>'localhost',     // DBサーバーのホスト名
                 'username'=>'user_name', // DBに接続するユーザー名
                 'password'=>'passwd',    // 上記ユーザーのパスワード
                 'dbname'=>'test'         // DB名(スキーマ名)
               );
// アダプタの取得
$dbh = Zend_Db::factory('MySQLi', $params);

行の取得

$where = $dbh->quoteInto('id = ?', $id);    // エスケープ処理
$sql = "SELECT name, age "
       . "FROM users "
       . "WHERE $where "
$rows = $dbh->fetchArray($sql);

戻り値は以下のようになります

array(
     0 =>array('name'=>hoge, 'age'=>1),
     1 =>...
)

fetchArrayのほかに、 他の取得方法として、

  • fetchAssoc 取得した最初の行の最初の列がキーになる。
  • fetchRow 最初の行のみを取得
  • fetchCol 最初の列のみ取得
  • fetchPairs 最初の列が配列のキーに、2番目の行が値になる
  • fetchOne 最初の値のみ取得

があります。

行の挿入

$table = 'users';
$values = array(
                'name'=>'bar',
                'age'=>20
          );
 
$dbh->insert($table, $values);
 
// auto incrementでprimary keyの場合、keyの値を取得
$id = $dbh->lastInsertId();

行の更新

$table = 'users';
$set = array(
            'name'=>'baz',
            'age'=>25
);
$where = $dbh->quoteInto('id = ?', $id);
 
// 反映された行数が返る
$affected_row = $dbh->update($table, $set, $where);

where 部分は複数条件も可能です (selectも同様)

$where = array(
                $dbh->quoteInto('name = ?', 'baz'),
                $dbh->quoteInto('age in(?)', array(20, 21, 22))
               );

この場合は、(where) name = ‘baz’ AND age in(20, 21, 22) のようになります。

行の削除

$table = 'users';
$where = $dbh->quoteInto('id = ?', $id);
$affected_row = $dbh->delete($table, $where);

MySQLのマスター/スレーブ構成でレプリケーションをおこなう場合、アダプタの切り替えは自分でおこなわなくてはなりません。
一番簡単にやるならこんな感じでしょうか?

$master = Zend_Db::factory('MySQLi', $params);
$slave = Zend_Db::factory('MySQLi', $params);$slave->fetchAll(...);
$master->insert(...);
$master->update(...);
$master->delete(...);

いちいち面倒ですね。 後日よいほうほうを検討します。

コメントを投稿する