2010-03-26 13 views
39

Quiero obtener la última consulta que se 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.CakePHP - obtener la última consulta ejecutar

algo como esto sería genial:

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

Gracias de antemano.

Respuesta

2

Al tener un resumen rápido del libro, http://api.cakephp.org/2.3/class-DboSource.html#_getLog, puede activar 'logTransaction'. Aunque no lo he usado, no estoy seguro de cómo funcionará.

lo contrario, podría experimentar con FirePHP http://www.firephp.org/ y aquí está la guía para que, http://bakery.cakephp.org/articles/view/debugging-with-firephp

Usted puede tratar de DebugKit, http://github.com/cakephp/debug_kit aunque la parte superior de mi cabeza creo que lo hace todavía necesita de depuración 2 para conseguir que se trabajo.

Afortunadamente, algo podría darle una pista. :)

29

En CakePHP 1.x, los datos que desea están disponibles en DataSource::_queriesLog. Torta en realidad no proporcionan un método de obtención de este miembro, pero al ser el lenguaje PHP subyacente, nada le impide hacer lo siguiente:

En app/app_model.php:

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

    return end($logs); 
} 
+0

Cuando intento usar esta función solo obtengo "2010-03-29 11:13:29 Error:" en el archivo de registro de errores. Usé $ this-> log ($ this-> Job-> getLastQuery()); –

+0

$ this-> log (var_export ($ this-> Job-> getLastQuery(), true)); –

+0

¿A dónde llama $ this-> log()? Además, es posible que desee depurar la salida de Model :: getLastQuery antes de lanzarla al registro. Podría estar devolviendo una matriz, causando un error de conversión de matriz a cadena. –

3

Se puede usar esta 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; 
+0

da un error 'No se puede acceder a la propiedad protegida Mysql :: $ _ queriesLog', cake 2.3 – dav

3

Esta es una respuesta muy tarde, lo sé, pero para quien lo necesite en el futuro, siempre se puede restringir el establecimiento de depuración para 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. 
} 
+1

incluso puede hacer un método de depuración en uno de sus controladores que establece una variable de sesión verdadero/falso y establece la variable de configuración de depuración en consecuencia. – alinn

+1

Alinn, si el acceso a ese método no está asegurado correctamente, podría dar lugar a un ataque de seguridad donde cualquiera podría habilitar el modo de depuración. Ten cuidado. –

43

para la torta 2.0, el registro de consultas está protegido por lo que esto va a funcionar

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

Comprobé la función anterior y funciona bien si el modo de depuración es 2 pero no devuelve la consulta si el modo de depuración es 0. hay alguna otra solucion? –

28

Probado en CakePHP v2.3.2

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

Esto funcionó muy bien para mí. Asegúrese de tener el nivel de depuración configurado por encima de 1 en core.php – nbarth

2

Combinación de Matt y la solución de Blavia (funciona cuando 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; 
+0

. ¡Este funcionó para mí! ¡Gracias! :) –

2

simple que puede utilizar la función showlog()

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

Se puede utilizar esta:

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

pr($log);die; 
+0

está funcionando bien ... – ajeet

Cuestiones relacionadas