我希望能够在发生SQL错误时在error.log中记录完整的SQL查询。我的调试在core.php中设置为2。
输出显示如下:
2013-01-29 19:53:21 Error: SQLSTATE[HY000]: General error: 1364 Field 'street' doesn't have a default value
#0 D:\xampp\htdocs\my_project\lib\Cake\Model\Datasource\DboSource.php(459): PDOStatement->execute(Array)
#1 D:\xampp\htdocs\my_project\lib\Cake\Model\Datasource\DboSource.php(425): DboSource->_execute('INSERT INTO `st...', Array)
#2 D:\xampp\htdocs\my_project\lib\Cake\Model\Datasource\DboSource.php(1007): DboSource->execute('INSERT INTO `st...')
正如您所看到的,SQL语句只是部分记录,其余部分被删除,省略了省略号。
我正在使用DebugKit,但即使这样也不会在DebugKit窗口中产生完整的SQL日志。
我在这里抛出异常并记录getTraceAsString()。
任何解决方案都将受到高度赞赏。
谢谢你,
米^ E
答案 0 :(得分:0)
您可以尝试使用this question的答案。我知道这不是最佳答案,但在该特定问题中,您可以找到this plugin,它将输出日志文件的完整SQL。
答案 1 :(得分:0)
我做了以下(Cake 2.5.6)
/app/Lib/Error/ErrorHandlerWithSqlLog.php
App::uses('ErrorHandler', 'Error');
class ErrorHandlerWithSqlLog{
public static function handleException(Exception $exception) {
if ($exception instanceof PDOException && !empty($exception->queryString)) {
CakeLog::write(LOG_ERR, "SQL query: ".$exception->queryString);
}
ErrorHandler::handleException($exception);
}
}
将其添加到您的引导程序中:
require_once(APP . 'Lib' . DS . 'Error' . DS . 'ErrorHandlerWithSqlLog.php');
并将core.php中的默认异常处理程序更改为自定义处理程序:
Configure::write('Exception', array(
//'handler' => 'ErrorHandler::handleException',
'handler' => 'ErrorHandlerWithSqlLog::handleException',
'renderer' => 'ExceptionRenderer',
'log' => true
));
答案 2 :(得分:0)
更容易捕捉到,
PDOException有一个名为queryString的属性,带有当前查询
您可以在_execute方法
中的源文件DboSource.php中看到try {
$this->MyModel->find(....)
}catch(Exception $_ex) {
var_dump($_ex)
}
我希望对你有所帮助