web-dev-qa-db-fra.com

CakePHP - Obtenez la dernière requête lancée

Je veux obtenir la dernière requête de CakePHP. Je ne peux pas activer le débogage dans core.php et je ne peux pas exécuter le code localement. J'ai besoin d'un moyen d'obtenir la dernière requête SQL et de la connecter au journal des erreurs sans affecter le site en direct. Cette requête échoue mais est en cours d'exécution.

quelque chose comme ça serait génial:

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

Merci d'avance.

43
Phantz

Pour Cake 2.0, le journal des requêtes est protégé donc cela fonctionnera

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

Testé dans CakePHP v2.3.2

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

Dans CakePHP 1.x, les données que vous voulez sont accessibles dans DataSource::_queriesLog. Cake ne fournit pas vraiment de méthode getter pour ce membre, mais le langage sous-jacent étant PHP, rien ne vous empêche de faire ce qui suit:

Dans app/app_model.php:

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

    return end($logs);
}
29
Daniel Wright

Combinaison de la solution de Matt et de blavia (fonctionne lorsque le débogage n'est pas 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;
3

Simple, vous pouvez utiliser la fonction showLog ()

var_dump($this->YourModel->getDataSource()->showLog());
3
Quy Le

C'est une réponse très tardive, je sais, mais pour quiconque en aura besoin à l'avenir, vous pouvez toujours restreindre la définition du débogage à votre IP, par exemple:

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

Vous pouvez utiliser cette ligne.

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

Ayant un survol rapide du livre, cakephp api getLog vous pouvez activer logTransaction. Bien que ne l'ayant pas utilisé, je ne sais pas comment il fonctionnera.

Sinon, vous pouvez expérimenter avec FirePHP et voici le guide pour cela ,

Vous pouvez essayer DebugKit , bien que je pense que vous avez encore besoin du débogage 2 pour le faire fonctionner.

J'espère que quelque chose pourrait vous donner une piste. :)

2
David Yell

Vous pouvez utiliser ceci:

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

pr($log);die;
1
ajeet

Il existe deux méthodes pour afficher la requête dans CakePHP.

Les deux méthodes, vous devez ajouter la ligne ci-dessous dans app/Config/core.php

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

Premières méthodes:

debug($this->getLastQuery()); 

où vous voulez obtenir la requête, ajoutez la ligne ci-dessus et appelez cette fonction getLastQuery() sur le même contrôleur en utilisant le code ci-dessous

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'];
}

deuxième méthode:

ajoutez la ligne ci-dessous dans les fichiers Elements.

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