2010-08-14 15 views
5

Tengo un problema extraño al usar Zend Framework y Mysql. Me genera una consulta:Zend PDO error - ¿cómo puedo depurarlo?

SELECT events.idUser, szForename, szLastname, readers.szName, idZoneFrom, events.dtTime FROM events, users, readers WHERE events.idUser = users.idUser AND events.idReader = readers.idReader AND dtTime >= '2010:02:15 0:00:00' AND dtTime < '2010:02:16 0:00:00' ORDER BY dtTime 

La consulta funciona bien si lo ejecuto en alguna consola como el PMA, Navicat o cliente cáscara, pero cuando intento ejecutarlo usando un modelo que se extiende Zend_Db_Table Commend

$arResult = $this->getDefaultAdapter()->query($szQuery)->fetchAll(); 

que va con 1064 error:

enter code here 

An error occurred 
Application error 
Exception information: 

Message: 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 '' at line 1 
Stack trace: 

#0 C:\xampp\htdocs\projekty\doors2\library\Zend\Db\Statement.php(300): Zend_Db_Statement_Pdo->_execute(Array) 
#1 C:\xampp\htdocs\projekty\doors2\library\Zend\Db\Adapter\Abstract.php(468): Zend_Db_Statement->execute(Array) 
#2 C:\xampp\htdocs\projekty\doors2\library\Zend\Db\Adapter\Pdo\Abstract.php(238): Zend_Db_Adapter_Abstract->query('SELECT zoneName...', Array) 
#3 C:\xampp\htdocs\projekty\doors2\application\models\Zones.php(24): Zend_Db_Adapter_Pdo_Abstract->query('SELECT zoneName...') 
#4 C:\xampp\htdocs\projekty\doors2\application\models\Events.php(87): Application_Model_Zones->getZoneInfo(NULL) 
#5 C:\xampp\htdocs\projekty\doors2\application\controllers\IndexController.php(52): Application_Model_Events->getEventsList(NULL, '02/15/2010') 
#6 C:\xampp\htdocs\projekty\doors2\library\Zend\Controller\Action.php(513): IndexController->eventsAction() 
#7 C:\xampp\htdocs\projekty\doors2\library\Zend\Controller\Dispatcher\Standard.php(295): Zend_Controller_Action->dispatch('eventsAction') 
#8 C:\xampp\htdocs\projekty\doors2\library\Zend\Controller\Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) 
#9 C:\xampp\htdocs\projekty\doors2\library\Zend\Application\Bootstrap\Bootstrap.php(97): Zend_Controller_Front->dispatch() 
#10 C:\xampp\htdocs\projekty\doors2\library\Zend\Application.php(366): Zend_Application_Bootstrap_Bootstrap->run() 
#11 C:\xampp\htdocs\projekty\doors2\public\index.php(26): Zend_Application->run() 
#12 {main} 

Request Parameters: 

array (
    'controller' => 'index', 
    'action' => 'events', 
    'module' => 'default', 
    'idUser' => '0', 
    'dt' => '02/15/2010', 
) 

Como puedo depurarlo para encontrar el problema ?? ¿O tal vez sabes qué podría haber hecho mal?

ps. Uso el mismo usuario de DB para las pruebas de php y de consulta ...

+1

Pls publica la consulta SQL iniciada por 'SELECT zoneName ...', parece que la consulta es la causa del error, no la consulta publicada –

+0

Sí, acabo de encontrar un error en un bucle que opera en el conjunto de resultados. Solo un error tonto en el nombre del parámetro pasado me dio nulo en lugar de id. De todos modos, gracias por la ayuda. :) – Moby04

Respuesta

2

Su declaración de SQL tiene palabras reservadas, como puedo ver. Debería intentar construir su conexión para que pueda escapar automáticamente de los identificadores o debería hacerlo usted mismo, de forma manual. Para la primera opción, intente esto:

$options = array(Zend_Db::AUTO_QUOTE_IDENTIFIERS => false); 
    $params = array(
     'host'   => 'host', 
     'username'  => 'user', 
     'password'  => 'secret', 
     'dbname'   => 'db', 
     'options'  => $options 
); 
    $db = Zend_Db::factory('Pdo_Mysql', $params); 
0

Si se rompe la consulta en varias líneas se puede obtener un número de línea más útil para dónde está el error de sintaxis. Así es como formateo mis consultas. Los hace mucho más fáciles de leer, mantener y depurar.

SELECT 
    events.idUser, 
    szForename, 
    szLastname, 
    readers.szName, 
    idZoneFrom, 
    events.dtTime 
FROM events, 
    users, 
    readers 
WHERE events.idUser = users.idUser 
    AND events.idReader = readers.idReader 
    AND dtTime >= '2010:02:15 0:00:00' 
    AND dtTime < '2010:02:16 0:00:00' 
ORDER BY dtTime 
0

Además, en cuanto a los permisos, mysql utiliza un sistema de permisos basado en el usuario + host. Entonces, cierto usuario puede tener acceso a un recurso de base de datos desde localhost, pero no desde otros sistemas.

Compruebe http://dev.mysql.com/doc/refman/5.0/en/grant.html para obtener información sobre cómo modificar los permisos de usuario de mysql.

0

Si está utilizando zend, debería al menos preparar cualquier valor que se transfiera. Si la instrucción funciona en la línea de comando, no debería haber un problema con las palabras reservadas (a menos que por alguna razón las versiones de mysql son distintos, por supuesto).

Cuestiones relacionadas