CakePHP – 获取最后的查询运行

我想获取CakePHP运行的最后一个查询。 我不能在core.php中打开debugging,我不能在本地运行代码。 我需要一种方法来获取最后一个sql查询并将其logging到错误日志中,而不影响活动站点。 此查询失败,但正在运行。

这样的事情会很好:

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

提前致谢。

对于Cake 2.0,查询日志是受保护的,所以这将工作

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

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

app/app_model.php

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

在CakePHP v2.3.2中testing

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

你可以使用这个内联。

 $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; 

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

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

有一个快速浏览本书, http: //api.cakephp.org/2.3/class-DboSource.html#_getLog你可以打开“logTransaction”。 虽然没有使用它,我不知道它将如何执行。

否则,您可以尝试使用FirePHP http://www.firephp.org/ ,这里是它的指南, http://bakery.cakephp.org/articles/view/debugging-with-firephp

你可能会尝试DebugKit, http: //github.com/cakephp/debug_kit尽pipe我的头顶我认为你仍然需要debugging2才能使它工作。

希望有一些东西可以带领你。 🙂

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

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

马特和布莱维亚解决scheme的组合(debugging时不工作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; 

你可以使用这个:

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