2010-12-31 19 views
23

estoy usando MySQL con Zend Framework & Doctrina 2. Creo que incluso si usted no utiliza Doctrina 2, usted estará familiarizado con errores como¿Cómo depurar las consultas de MySQL/Doctrine2?

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

El problema es que yo no veo la consulta completa. Sin un marco ORM, probablemente podría repetir el sql fácilmente, pero con un marco, ¿cómo puedo averiguar qué SQL está tratando de ejecutar? Entrecerré el error hasta

$progress = $task->getProgress(); 

$progress se declara

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

En MySQL, la clase de tarea parece

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

Si usted tiene un objeto de consulta Doctrina, que no está claro en el código que has publicado, puede ejecutar '$ query-> getSqlQuery() 'para ver el SQL. Encuentra tu objeto de consulta en tu código y dale salida para ver qué está pasando. Alternativamente, puede activar el registro de consultas en SQL para ver qué es. – thetaiko

Respuesta

6

cómo sobre el uso de mysql general query log?

El registro general de consultas es un registro general de lo que está haciendo mysqld. El servidor escribe información en este registro cuando los clientes se conectan o desconectan, y registra cada instrucción SQL recibida de los clientes. El registro general de consultas puede ser muy útil cuando sospecha un error en un cliente y desea saber exactamente lo que el cliente envió a mysqld.

+0

No puedo habilitarlo en CLI con '--general_log = 1 --general_log_file =" ... "' pero lo logré en MySQL con 'SET global general_log = 'ON'' –

2

intenta utilizar Mysql de proxy entre el usuario y el servidor MySQL (http://forge.mysql.com/wiki/MySQL_Proxy). Luego puede configurar este proxy para registrar todas las solicitudes.

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

+0

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

+1

Gracias, corregido. Podría intentar una edición en su lugar, sería revisada si no tiene suficiente reputación para una edición directa. – regilero

77

La solución más sencilla para las consultas de depuración en Doctrina 2:

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

De esta manera no funcionó para mí, Tuve que llamarlo así: $ em-> getConnection() -> getConfiguration() -> setSQLLogger ( new Doctrine \ DBAL \ Logging \ EchoSQLLogger()); – dimirc

+3

Esta debería ser la respuesta aceptada. – flu

+1

Esta es, de lejos, la mejor respuesta aquí. – skrilled

12

Usted tiene que usar un DBAL SQLLogger. Puede utilizar el registrador de SQL nativo básico \ Doctrine \ DBAL \ Logging \ EchoSQLLogger, o puede implementar el suyo con una interfaz de Doctrine \ DBAL \ Logging \ SQLLogger.

Para el registrador básico, debe conectar el registrador SQL al EntityManager. Así, en su Doctrina de arranque utilización archivo:

$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); 

Tenga en cuenta que nosotros creamos nuestra EntityManager de la gama$ connectionParams.

Importante:. Si usa una conexión DBAL para crear su EntityManager, debe adjuntarla tanto en la conexión DBAL como en ORM EntityManager.Por ejemplo, en Zend Framework,

usted hace esto:

$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

Si su desarrollo en ZF2 que pueda eithe Utilice la solución anterior publicada por beberlei, aunque esto no se refleja en su pantalla, lo que no es exactamente una buena práctica, sino útil.

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

o puede utilizar ZendDeveloperTools que muestra la consulta ejecutar en la barra de herramientas.

enter image description here

1

Tal vez se debe utilizar un Zend_Db_Profile en su entorno [de desarrollo].

Esto registrará sus consultas con el tiempo de ejecución y otras informaciones.

Si tiene un registro de error que registra sus excepciones, entonces todo se puede encontrar en sus archivos de registro.

Vea este enlace: Zend Enable SQL Query logging

también ver este Zend Framework Ayudante: https://github.com/jokkedk/ZFDebug

Cuestiones relacionadas