我使用Zend Framework和Mysql有一个奇怪的问题。我生成了一个查询:
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或shell客户端)中运行它,但是当我尝试使用通过推荐扩展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。我使用相同的db用户进行php和查询测试...
答案 0 :(得分: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);
答案 1 :(得分: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
答案 2 :(得分:0)
此外,对于权限,mysql使用基于用户+主机的权限系统。因此,某个用户可以从localhost访问数据库资源,但不能访问其他系统。
检查http://dev.mysql.com/doc/refman/5.0/en/grant.html以获取有关如何更改mysql用户权限的信息。
答案 3 :(得分:0)
如果你正在使用zend,你应该至少准备传入的任何值。如果语句在命令行中工作,那么保留字应该没有问题(除非由于某种原因,mysql的版本是当然不同。)