【问题标题】:Zend PDO error - how can I debug it?Zend PDO 错误 - 我该如何调试它?
【发布时间】:2010-08-14 15:14:03
【问题描述】:

我在使用 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。我对 php 和查询测试都使用相同的 db 用户...

【问题讨论】:

  • 请贴出SELECT zoneName...发起的SQL查询,看来是查询导致错误,而不是贴出的查询
  • 是的,我刚刚在结果集上运行的循环中发现了一个错误。只是传递参数名称中的一个愚蠢错误给了我 null 而不是 id。无论如何,谢谢你的帮助。 :)

标签: php mysql zend-framework zend-db zend-db-select


【解决方案1】:

如我所见,您的 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);

【讨论】:

  • 该死...我已经为这种语法搜索了很多... Zend 文档很糟糕,因为信息过多。非常感谢。需要启动适配器以记录不要与 defaultAdapter 提交/回滚混淆。再次感谢!
【解决方案2】:

如果您将查询分成多行,您可能会得到一个更有用的行号,用于说明语法错误的位置。这就是我格式化查询的方式。它使它们更易于阅读、维护和调试。

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

【讨论】:

    【解决方案3】:

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

    查看http://dev.mysql.com/doc/refman/5.0/en/grant.html 以获取有关如何更改 mysql 用户权限的信息。

    【讨论】:

      【解决方案4】:

      如果你使用zend,你至少应该准备好任何传入的值。如果语句在命令行中工作,那么保留字应该没有问题(除非由于某种原因mysql的版本是当然是不同的)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-21
        • 1970-01-01
        • 2012-01-15
        • 1970-01-01
        • 2012-09-17
        • 2015-05-15
        • 1970-01-01
        相关资源
        最近更新 更多