2013-05-27 8 views
12

Meine Abfrage ruft den Zeitüberschreitungsfehler bei jedem Lauf ab. Es ist eine Seitennummerierung mit Joins.
Ich möchte das SQL debuggen, aber da ich eine Zeitüberschreitung erhalte, kann ich es nicht sehen.cakephp siehe die kompilierte SQL-Abfrage vor der Ausführung

Wie kann ich die kompilierte SQL-Abfrage vor der Ausführung sehen?


Einige Kuchen Code:

$this -> paginate = array(
     'limit' => '16', 
     'joins' => array(array(
       'table' => 'products', 
       'alias' => 'Product', 
       'type' => 'LEFT', 
       'conditions' => array('ProductModel.id = Product.product_model_id') 
      )), 
     'fields' => array(
      'COUNT(Product.product_model_id) as Counter', 
      'ProductModel.name' 
      ), 
     'conditions' => array(
      'ProductModel.category_id' => $category_id, 
     ), 
     'group' => array('ProductModel.id') 
    ); 

Antwort

26

Zuerst weg, stellen Sie die debug Variable 2 in app/config/config.php.

Dann fügen:

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

am Ende des Layouts. Dies sollte eigentlich in Ihrem Standard-Kuchen-Layout auskommentiert werden.

Sie können nun alle SQL-Abfragen sehen, die zur Datenbank gehen.

Jetzt kopieren Sie die Abfrage und verwenden Sie den Befehl SQL EXPLAIN (Link ist für MySQL) über die Datenbank, um zu sehen, was die Abfrage in der DBMS tut. Für mehr auf CakePHP Debugging überprüfen Sie here.

Da Ihr Skript nicht einmal machen, können Sie versuchen mit dem neuesten Protokoll direkt aus der Datenquelle zu erhalten:

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

Diese in einem Modell sein muss, da die getDatasource() Funktion in einem Modell definiert ist. Überprüfen Sie die gesamte $logs Variable und sehen Sie, was dort drin ist.

+0

Dank. aber es funktioniert nicht. Das Problem ist, dass das Skript nie zum Teil des Renderings kommt, da das Timeout in der Controller-Aktionsebene liegt. – yossi

+0

Antwort aktualisiert. –

+0

Und dieses Skript wird die letzte Abfrage von der vorherigen Ausführung zurückgeben? – yossi

4
Try... 
function getLastQuery($model) { 
    $dbo = $model->getDatasource(); 
    $logData = $dbo->getLog(); 
    $getLog = end($logData['log']); 
    echo $getLog['query']; 
} 
+0

Diese Funktion funktioniert auf einem Server mit PHP 5.4.32, aber nicht auf einem Server mit 5.5.16 in diesem Fall $ dbo-> getLog() ist nur leer. Auf dem anderen Server bekomme ich volle Protokolle. Irgendeine Ahnung, warum die Funktion nicht am 5.5 funktioniert. Ausführung? – user1555112

+0

@ user1555112 Ich bin mir nicht sicher, was das Problem ist, aber es funktioniert gut auf 5.6.1 –

+0

@ user1555112 wahrscheinlich hatten Sie Debug-Modus ausgeschaltet in Ihrer Konfiguration, wenn Sie this-> log oder CakeLog – LogixMaster

4

Eine weitere Sache, die Sie tun können, ist ....

Zum Kuchen/Model/Datasource/DboSource.php und Locate-Funktion execute() und print $ SQL-Variable. Das sollte die SQL drucken.

Dies ist sicherlich nicht der sauberste Weg (wie Sie Cake Verzeichnis ändern) .. aber sicherlich wäre am schnellsten zu debuggen, wenn etwas mit sql nicht funktioniert.

+0

Wenn alles andere völlig kaputt ist Wegen einer Rogue-Abfrage ist dies manchmal der hilfreichste Weg! – almcnicoll

+1

Die Antwort ist auch hilfreich für Befehlszeilenumgebungen, in denen Sie nicht auf das Element 'sql_dump' zugreifen können. –

+0

Danke! Dieser hat geholfen :) – olleh

1
class YourController extends AppController { 
    function testfunc(){ 
     $this->Model->find('all', $options); 
     echo 'SQL: '.$this->getLastQuery(); 
    } 

    function getLastQuery() 
    { 
     $dbo = ConnectionManager::getDataSource('default'); 
     $logs = $dbo->getLog(); 
     $lastLog = end($logs['log']); 
     return $lastLog['query']; 
    } 
} 

oder Sie können alle die Abfrage erhalten, indem das Hinzufügen folgende Zeile in die Funktion execute() in lib/Kuchen/Model/DataSource.php

Debugger::dump($sql); 
1

einfache Art und Weise alle ausgeführten Abfrage von zu zeigen, Ihr bestimmtes Modell:

$sqllog = $this->ModelName->getDataSource()->getLog(false, false);  
    debug($sqllog); 
0

setzen die Debug-Variable auf 2 in app/config/config.php.

echo $this->Payment->save(); 

heraus gesetzt wie => SQL-Abfrage: INSERT INTO photoora_photoorange. payments VALUES (*******)

[insert Abfrage] [2]