3

我希望能够在 error.log 中记录完整的 SQL 查询,特别是在发生 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() 。

任何解决方案将不胜感激。

谢谢你,
m^e

4

3 回答 3

0

你可以尝试使用这个问题的答案。我知道这不是最好的答案,但在那个特定的问题中,您可以找到这个插件,它将输出日志文件的完整 SQL。

于 2013-03-11T03:19:27.080 回答
0

我做了以下(蛋糕2.5.6)

  1. 在中创建自定义错误处理程序

/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
));
于 2015-05-15T11:26:28.217 回答
0

它更容易捕捉异常,

PDOException 有一个名为 queryString 的属性,用于当前查询

您可以在 _execute 方法中的源文件 DboSource.php 中看到

try {
$this->MyModel->find(....)
}catch(Exception $_ex) {
var_dump($_ex)
}

我希望对你有帮助

于 2018-05-24T17:13:49.840 回答