2010-08-14 72 views
5

我有一个奇怪的问题,使用Zend Framework和Mysql。我生成一个查询:Zend PDO错误 - 我该如何调试?

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 

如果我喜欢PMA,Navicat的或壳客户端,但一些控制台运行的查询工作正常,当我尝试使用,通过表彰扩展Zend_Db_Table类的模型来运行它

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

它会与1064错误:

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', 
) 

如何调试它找到了问题?或者,也许你知道我做错了什么?

ps。我使用相同的数据库用户为PHP和查询测试...

+1

请发布由'SELECT zoneName ...'开始的SQL查询,看起来这个查询是错误的原因,而不是发布的查询 – 2010-08-14 15:21:34

+0

是的,我刚刚发现在结果集上运行的循环中有错误。传递的参数名称中的一个愚蠢的错误给了我null而不是id。无论如何,感谢您的帮助。 :) – Moby04 2010-08-14 16:19:12

回答

2

您的SQL语句有保留字,我可以看到。你应该尝试构建你的连接,这样它可以自动转义标识符,或者你应该手动完成自己的连接。对于第一种选择,试试这个:

$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

如果你打破查询分成多个行,你可能会得到其中的语法错误是一个更有用的行号。这是我如何格式化我的查询。它使他们更容易阅读,维护和调试。

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

此外,对于权限,mysql使用基于用户+主机的权限系统。因此,某个用户可以从本地主机访问数据库资源,但不能从其他系统访问数据库资源。

有关如何更改mysql用户权限的信息,请参阅http://dev.mysql.com/doc/refman/5.0/en/grant.html

0

如果您使用的是zend,至少应该准备传入的任何值。如果语句在命令行中运行,那么应该不会出现保留字的问题(除非由于某些原因,mysql的版本当然是不同的)。