我想得到最后一个查询CakePHP。我无法在core.php中打开调试,我无法在本地运行代码。我需要一种方法来获取最后的SQL查询并将其记录到错误日志而不影响实时站点。此查询失败但正在运行。
这样的事情会很棒:
$this->log($this->ModelName->lastQuery);
提前致谢。
答案 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;