如何在生产站点上跟踪CakePHP中的SQL错误

时间:2014-10-08 05:39:30

标签: php debugging cakephp

如果插入或更新功能不起作用,我想跟踪生产站点上的错误。

测试这个功能我已经在我的控制器中创建了一个功能: -

function testSqlStatement(){

  $this->autoRender = false;
  $save=array('UserId'=>'48','Active'=>'qw');
  $this->User->saveAll($save);
  $log = $this->getDataSource()->error;
  $this->log('sql error' . print_r($log, true), 'sql');
  }

我得到的错误是: - 调用未定义的方法AdminsController :: getDataSource() 我必须定义getdatasource?是否有任何其他方法来知道错误,而无需将调试转换为2

2 个答案:

答案 0 :(得分:0)

您使用以下方式:

onError错误回调由create(),read(),update()和delete()方法中的DboSource类调用。因此,如果您正在编写自定义查询并通过模型的query()方法调用它,那么onError()将不会自动调用,但不用担心,您仍然可以跟踪SQL错误。这些CRUD方法与query()一起使用execute()方法,该方法将SQL错误设置为类变量,名为“error”

lastError()方法已经在每个DBO源(mysql,mssql等)中实现。

让我们继续编写我们的模型回调。在文本文件中记录错误的示例代码将是:

<?php

function onError()
{
    // The SQL error
    $error = $this->getDataSource()->error;

    // Log file
    $logFile = LOGS . 'sql_errors.txt';

    // Log the error
    file_put_contents($logFile, file_get_contents($logFile) . $error . "\n\n");
}

此代码可以放在您的app_model中。

邮件错误的另一个示例代码就是这样的

function onError()
{
    // The SQL error
    $error = $this->getDataSource()->error;

    // Send the error
    mail('webmaster@example.com', 'SQL errors', $error);
}

答案 1 :(得分:0)

您的问题是,当$this->getDataSource指的是控制器而非模型时,您正在调用$this。您想要$this->User->getDataSource()代替:

function testSqlStatement(){
    $this->autoRender = false;
    $save = array('UserId'=>'48','Active'=>'qw');
    $this->User->saveAll($save);
    $log = $this->User->getDataSource()->error;
    $this->log('sql error' . print_r($log, true), 'sql');
}