2010-12-31 9 views
23

Ich verwende MySQL mit Zend Framework & Lehre 2. Ich denke, auch wenn Sie 2 Lehre nicht verwenden, werden Sie mit Fehlern wieWie debugge ich MySQL/Doctrine2 Abfragen?

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ASC' at line 1

Das Problem ist, dass ich vertraut sein Die vollständige Abfrage wird nicht angezeigt. Ohne ein ORM-Framework könnte ich den SQL-Code wahrscheinlich leicht widerspiegeln, aber mit einem Framework, wie kann ich herausfinden, was SQL versucht, auszuführen? Ich verengte den Fehler bis auf

$progress = $task->getProgress(); 

$progress

erklärt
// Application\Models\Task 
/** 
* @OneToMany(targetEntity="TaskProgress", mappedBy="task") 
* @OrderBy({"seq" = "ASC"}) 
*/ 
protected $progress; 

In MySQL, die Task-Klasse sieht aus wie

CREATE TABLE `tasks` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `owner_id` int(11) DEFAULT NULL, 
    `assigned_id` int(11) DEFAULT NULL, 
    `list_id` int(11) DEFAULT NULL, 
    `name` varchar(60) NOT NULL, 
    `seq` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `tasks_owner_id_idx` (`owner_id`), 
    KEY `tasks_assigned_id_idx` (`assigned_id`), 
    KEY `tasks_list_id_idx` (`list_id`), 
    CONSTRAINT `tasks_ibfk_1` FOREIGN KEY (`owner_id`) REFERENCES `users` (`id`), 
    CONSTRAINT `tasks_ibfk_2` FOREIGN KEY (`assigned_id`) REFERENCES `users` (`id`), 
    CONSTRAINT `tasks_ibfk_3` FOREIGN KEY (`list_id`) REFERENCES `lists` (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1$$ 
+0

Wenn Sie eine Lehre Query-Objekt haben, die in dem Code nicht klar ist, dass Sie gebucht haben, können Sie laufen '$ query-> getSqlQuery() 'um das SQL zu sehen. Suchen Sie Ihr Abfrageobjekt in Ihrem Code und geben Sie es aus, um zu sehen, was gerade passiert. Alternativ können Sie die Abfrageprotokollierung in SQL aktivieren, um zu sehen, was es ist. – thetaiko

Antwort

6

wie etwa mysql general query log mit?

Das allgemeine Abfrageprotokoll ist eine allgemeine Aufzeichnung dessen, was mysqld macht. Der Server schreibt Informationen in dieses Protokoll, wenn Clients eine Verbindung herstellen oder trennen, und protokolliert jede von Clients empfangene SQL-Anweisung. Das allgemeine Abfrageprotokoll kann sehr nützlich sein, wenn Sie einen Fehler in einem Client vermuten und genau wissen möchten, was der Client an mysqld gesendet hat.

+0

Ich kann es nicht aktivieren in CLI mit '--general_log = 1 --general_log_file =" ... "' aber ich schaffte es in MySQL mit 'SET global general_log = 'ON'' –

2

Try Mysql Proxy zwischen den Sie verwenden und den MySQL-Server (http://forge.mysql.com/wiki/MySQL_Proxy). Dann können Sie diesen Proxy so konfigurieren, dass alle Anfragen protokolliert werden.

http://mysql.stu.edu.tw/tech-resources/articles/proxy-gettingstarted.html

+0

Link gebrochen, http://mysql.stu.edu.tw/tech-resources/articles/proxy-gettingstarted.html – Tony

+1

Danke, behoben. Sie könnten stattdessen eine Bearbeitung versuchen, die überprüft würde, wenn Sie nicht genug Reputation für eine direkte Bearbeitung haben. – regilero

77

einfachste Lösung für das Debuggen von Abfragen in Lehre 2:

$em->getConnection() 
    ->getConfiguration() 
    ->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger()) 
; 
+13

Dieser Weg hat nicht funktioniert für mich, Ich musste es so nennen: $ em-> getConnection() -> getConfiguration() -> setSQLLogger ( new Doctrine \ DBAL \ Logging \ EchoSQLLogger()); – dimirc

+3

Dies sollte die akzeptierte Antwort sein. – flu

+1

Dies ist bei weitem die beste Antwort hier. – skrilled

12

Sie haben eine DBAL SQLLogger zu verwenden. Sie können den grundlegenden nativen SQL-Logger \ Doctrine \ DBAL \ Logging \ EchoSQLLogger verwenden, oder Sie können Ihren mit einer Schnittstelle von Doctrine \ DBAL \ Logging \ SQLLogger implementieren.

Für den Basis-Logger müssen Sie den SQL Logger an den EntityManager anhängen. Also, in der Lehre Bootstrap-Datei:

$config = new Doctrine\ORM\Configuration(); 
// ... config stuff 
$config->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger()); 
$connectionParams = array(
     'dbname' => 'example', 
     'user' => 'example', 
     'password' => 'example', 
     'host' => 'localhost', 
     'driver' => 'pdo_mysql'); 
//make the connection through an Array of params ($connectionParams) 
$em = EntityManager::create($connectionParams, $config); 

Bitte beachte, dass wir unsere EntityManager vom $ ConnectionParams Array zu erstellen.

Wichtig:. Wenn Sie eine DBAL-Verbindung zum Erstellen Ihres EntityManagers verwenden, müssen Sie sie sowohl in der DBAL-Verbindung als auch im ORM-EntityManager anhängen.Zum Beispiel in Zend Framework,

Sie tun dies:

$config = new Doctrine\ORM\Configuration(); 
// ...config stuff 
// LOGGER 
$config->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger()); 

// make the connection through DBAL (DriverManager::getConnection) 
// note that we attach $config in $connApp(DBAL) and $emApp(ORM) 
$connApp = DriverManager::getConnection($connectionParams, $config); 
$emApp = EntityManager::create($connApp, $config); 
Zend_Registry::set('emApp', $emApp); 
Zend_Registry::set('connApp', $connApp); 
1

Wenn Ihr in ZF2 entwickeln Sie können eithe Verwenden Sie die obige Lösung von beberlei, obwohl dies Echo auf Ihrem Display, die nicht gerade Best Practice aber nützlich ist.

$em->getConnection() 
    ->getConfiguration() 
    ->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger()) 
; 

oder Sie könnten ZendDeveloperTools verwenden, die die Abfrage in der Symbolleiste ausführen anzeigt.

enter image description here

1

Vielleicht sollten Sie einen Zend_Db_Profile in Ihrer [Entwicklung] Umgebung.

Dies wird Ihre Abfragen mit Laufzeit und anderen Informationen protokollieren.

Wenn Sie ein Fehlerprotokoll haben, das Ihre Ausnahmen protokolliert, dann kann alles in Ihren Protokolldateien gefunden werden.

Siehe diesen Link: Zend Enable SQL Query logging

Siehe auch dieses Zend Framework Helper: https://github.com/jokkedk/ZFDebug