CakePHP - 获取最后一次查询运行

时间:2010-03-26 04:59:40

标签: mysql logging cakephp

我想得到最后一个查询CakePHP。我无法在core.php中打开调试,我无法在本地运行代码。我需要一种方法来获取最后的SQL查询并将其记录到错误日志而不影响实时站点。此查询失败但正在运行。

这样的事情会很棒:

$this->log($this->ModelName->lastQuery);

提前致谢。

11 个答案:

答案 0 :(得分:46)

对于Cake 2.0,查询日志受到保护,因此可以使用

function getLastQuery() {
  $dbo = $this->getDatasource();
  $logs = $dbo->getLog();
  $lastLog = end($logs['log']);
  return $lastLog['query'];
}

答案 1 :(得分:30)

在CakePHP v2.3.2中测试

$log = $this->Model->getDataSource()->getLog(false, false);
debug($log);

答案 2 :(得分:29)

在CakePHP 1.x中,您可以在DataSource::_queriesLog中访问所需的数据。 Cake并没有真正为这个成员提供getter方法,但底层语言是PHP,没有什么能阻止你做以下事情:

app/app_model.php

function getLastQuery()
{
    $dbo = $this->getDatasource();
    $logs = $dbo->_queriesLog;

    return end($logs);
}

答案 3 :(得分:3)

您可以使用此内联。

$dbo = $this->Model->getDatasource();
// store old state
$oldStateFullDebug = $dbo->fullDebug;
// turn fullDebug on
$dbo->fullDebug = true;

// Your code here! eg.
$this->Model->find('all');

// write to logfile
// use print_r with second argument to return a dump of the array
Debugger::log(print_r($dbo->_queriesLog, true));
// restore fullDebug
$dbo->fullDebug = $oldStateFullDebug;

答案 4 :(得分:3)

这是一个非常晚的答案,我知道,但对于将来需要这个的人,你总是可以将调试设置限制为你的IP,例如:

Configure::write('debug', 0);
if($_SERVER["REMOTE_ADDR"] == '192.168.0.100'){
Configure::write('debug', 2); //Enables debugging only for your IP.
}

答案 5 :(得分:3)

Matt和Blavia的解决方案的组合(当调试不是2时有效):

$dbo = $this->Model->getDatasource();
$oldStateFullDebug = $dbo->fullDebug;
$dbo->fullDebug = true;
// find or whatever...
$this->Model->find("all");
$logs = $dbo->getLog();
$lastLog = end($logs['log']);
CakeLog::write("DBLog", $lastLog['query']);
$dbo->fullDebug = $oldStateFullDebug;

答案 6 :(得分:3)

简单你可以使用showLog()函数

var_dump($this->YourModel->getDataSource()->showLog());

答案 7 :(得分:2)

快速浏览一下书籍cakephp api getLog,您可以启用logTransaction。虽然没有使用它,但我不确定它会如何表现。

否则你可以试用FirePHP,这里是guide for it

你可能会尝试DebugKit,虽然我认为你仍然需要调试2才能让它发挥作用。

希望有些东西可以带给你领先。 :)

答案 8 :(得分:1)

您可以使用:

$log = $this->Model->getDataSource()->getLog(false, false);

pr($log);die;

答案 9 :(得分:0)

有两种方法可以在CakePHP中查看查询。

这两种方法都必须在app / Config / core.php中添加以下一行

Configure::write('debug', 2); 

第一种方法:

debug($this->getLastQuery()); 

要获取查询的位置,在行上方添加并使用以下代码在同一控制器上调用此函数getLastQuery()

public function getLastQuery() {
    $dbo = $this->TModel->getDatasource();  //Here TModel is a model.what table you want to print 
    $logs = $dbo->getLog();
    $lastLog = end($logs['log']);
    return $lastLog['query'];
}

第二种方法:

将以下行添加到任何Elements文件中。

<?php echo $this->element('sql_dump'); ?>

答案 10 :(得分:0)

这将为您提供帮助。

echo '<pre>';
$log = $this->YOUR_MODEL->getDataSource(); 
print_r($log);
exit;