facebook twitter hatena line google mixi email

Php/zend framework/DBメモ

提供: 初心者エンジニアの簡易メモ
移動: 案内検索

DB接続

$this->db = Zend_Db::factory('Pdo_Mysql', array(
       'host'          => 'localhost',
       'username'      => 'usertest',
       'password'      => 'password',
       'dbname'        => 'test',
       'charset'       => 'utf8',
       'port'          => '3306'
));
$sql = "SELECT * FROM test";
$rows = $this->db->fetchAll($sql);
  • DB接続エラー修正

trying to connect via unix:///var/mysql/mysql.sock

-        'host'          => 'localhost',
+        'host'          => '127.0.0.1',

oracleだと・・

Zend_Db::factory('Pdo_Oci'

DBのquote

$this->db->quote($_POST['test']);

外部dbのiniを使用

//Zend_Configコンポーネントの呼び出し
require_once 'Zend/Config/Ini.php';
//Zend_Dbコンポーネントの呼び出し
require_once 'Zend/Db.php';
//外部ファイルdb.iniをロードしZend_Configオブジェクトを生成
$config = new Zend_Config_Ini('../../../../zendapps/db/db.ini','production');
//Zend_Configオブジェクトを使って、アダプタクラスを生成
$db = Zend_Db::factory($config->default);

db.ini

[production]
default.adapter = Pdo_Mysql
default.params.host = localhost
default.params.dbname = db_zend
default.params.username = xxxxx
default.params.password = xxxxxxxx
default.params.charset = UTF8
default.params.port = 3306

bootstrap使用

bootstrap.phpに以下を追記

protected function _initDb()
{
    //外部ファイルdb.iniをロードしZend_Configオブジェクトを生成
    $config = new Zend_Config_Ini(APPLICATION_PATH . '/configs/application.ini',APPLICATION_ENV);
    //Zend_Configオブジェクトを使って、アダプタクラスを生成
    $db = Zend_Db::factory($config->default);
    // $db->query("set names utf8");
    Zend_Db_Table::setDefaultAdapter($db);
}

プレースホルダ

$sql = 'INSERT INTO users(name, age) values(?, ?);';
$db->query($sql, array('taro', 10));

sqlログを取る

注:プレースホルダーとバインド値は個別に出力

  • action.php
$db = CustomDb::factory();
$db->query($sql);
  • CustomDb.php
<?php
require_once 'Zend/Db.php';
class CustomDb extends Zend_Db
{
   private $_db;
   private function __construct($adapter, $config = array())
   {
       $this->_db = Zend_Db::factory($adapter, $config);
       // プロファイルを有効に
       $this->_db->getProfiler()->setEnabled(true);
   }
   public static function factory($adapter, $config = array())
   {
       $class = __CLASS__;
       $instance = new $class($adapter, $config);
       return $instance;
   }
   public function __call($name, array $args)
   {
       switch ($name) {
       case 'fetchAll':
       case 'fetchRow':
       case 'fetchAssoc':
       case 'fetchCol':
       case 'fetchOne':
       case 'prepare':
       case 'query':
       case 'exec':
           require_once 'Zend/Log.php';
           $log = new Zend_Log();
           require_once 'Zend/Log/Writer/Stream.php';
           $log->addWriter(new Zend_Log_Writer_Stream('/tmp/sql.log'));
           try {
               $buf = call_user_func_array(array($this->_db, $name), $args);
               $query = $this->_db->getProfiler()->getLastQueryProfile();
               $log->log(sprintf("%s [%s] %ss", $query->getQuery(), join(",", $query->getQueryParams()), $query->getElapsedSecs()), Zend_Log::DEBUG);
           } catch (Exception $e) {
               $query = $this->_db->getProfiler()->getLastQueryProfile();
               $log->log(sprintf("%s [%s]", $query->getQuery(), join(",", $query->getQueryParams())), Zend_Log::ERR);
           }
           return $buf;
       default:
           return call_user_func_array(array($this->_db, $name), $args);
       }
   }
}

ステートメントホルダからfetch

$stmt = $db->query('SELECT * FROM bugs');
while ($row = $stmt->fetch()) {
    echo $row['bug_description'];
}