mysql - tutorial - CakePHP: ejecuta la última consulta
cakephp tutorial 3 (9)
Quiero que se ejecute la última consulta que ejecutó CakePHP. No puedo activar la depuración en core.php y no puedo ejecutar el código localmente. Necesito una forma de obtener la última consulta sql y registrarla en el registro de errores sin afectar el sitio en vivo. Esta consulta está fallando pero se está ejecutando.
algo como esto sería genial:
$this->log($this->ModelName->lastQuery);
Gracias por adelantado.
Combinación de la solución de Matt y Blavia (funciona cuando la depuración no es 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;
Con una rápida lectura del libro, cakephp api getLog puedes activar logTransaction
. Aunque no lo he usado, no estoy seguro de cómo funcionará.
De lo contrario, podrías experimentar con FirePHP y aquí está la guía para ello ,
Puede probar DebugKit , aunque creo que todavía necesita depurar 2 para que funcione.
Con suerte, algo podría darle una pista. :)
En CakePHP 1.x, los datos que desea son accesibles en DataSource::_queriesLog
. Cake realmente no proporciona un método getter para este miembro, pero el lenguaje subyacente es PHP, nada le impide hacer lo siguiente:
En app/app_model.php
:
function getLastQuery()
{
$dbo = $this->getDatasource();
$logs = $dbo->_queriesLog;
return end($logs);
}
Esta es una respuesta muy tardía, lo sé, pero para quien necesite esto en el futuro, siempre puede restringir la configuración de la depuración a su IP, por ejemplo:
Configure::write(''debug'', 0);
if($_SERVER["REMOTE_ADDR"] == ''192.168.0.100''){
Configure::write(''debug'', 2); //Enables debugging only for your IP.
}
Para Cake 2.0, el registro de consultas está protegido, así que esto funcionará
function getLastQuery() {
$dbo = $this->getDatasource();
$logs = $dbo->getLog();
$lastLog = end($logs[''log'']);
return $lastLog[''query''];
}
Probado en CakePHP v2.3.2
$log = $this->Model->getDataSource()->getLog(false, false);
debug($log);
Puedes usar esto en línea.
$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;
Puedes usar esto:
$log = $this->Model->getDataSource()->getLog(false, false);
pr($log);die;
Simple, puedes usar la función showLog ()
var_dump($this->YourModel->getDataSource()->showLog());