ZendでSQLのログを出力する
Zend_DBのSQL発行時にエラーになることがあり、実際どのようなSQLが実行されているのかを知りたいケースが結構あります。
Zend_DB_Profireというのがあったので、そちらを使ってみました。
まずは、bootstrap.phpで
$config = new Zend_Config_Ini('db.ini', 'db_setting');
$db = Zend_Db::factory($config->db);
$db->query('set names utf8');
$db->getProfiler()->setEnabled(true);
Zend_Db_Table_Abstract::setDefaultAdapter($db);
として、Profilerを有効にしました。
あとは、Zend_Db_Table_Abstractを継承したAbstractTableModelクラスを作成し、今までZend_Db_Table_Abstractを継承していた各テーブルモデルの継承元をこちらに変更します。
< ?php
require_once 'Zend/Db/Table.php';
require_once 'Zend/Log.php';
require_once 'Zend/Log/Writer/Stream.php';
class AbstractTableModel extends Zend_Db_Table_Abstract
{
protected function _update($data,$where){
$log = new Zend_Log();
$log->addWriter(new Zend_Log_Writer_Stream('sql.log'));
try{
$this->update($data, $where);
$query = $this->_db->getProfiler()->getLastQueryProfile();
$log->log($query->getQuery(),Zend_Log::DEBUG);
}catch(Exception $ex){
$query = $this->_db->getProfiler()->getLastQueryProfile();
$log->log($query->getQuery(),Zend_Log::ERR);
throw $ex;
}
}
}
Updateだけでなくselectやinsert、deleteもメソッドを追加しますが、割愛。
getLastQueryProfileでは最後に実行されたSQLが取得できるので、これをログに出力します。
ただ、「最後に」というのが曲者なのでタイミング的には正しい結果が得られないかもしれませんが、そこはデバッグ時のコードと割り切って使おうと思います。
Posted in PHP |
