【问题标题】:pdo exception when trying to access firebird尝试访问 firebird 时出现 pdo 异常
【发布时间】:2014-08-01 20:57:30
【问题描述】:

我必须使用 php 和 zend 框架 2 访问 firebird,但出现以下错误:

 /var/www/html/cad/vendor/zendframework/zendframework/library/Zend/Db/Adapter/Driver /Pdo/Statement.php:187

Message:

SQLSTATE[HY000]: General error: -204 Dynamic SQL Error SQL error code = -204 Table  unknown pessoa At line 1, column 19 

Stack trace:

#0 /var/www/html/cad/vendor/zendframework/zendframework/library/Zend/Db/Adapter/Driver /Pdo/Statement.php(187): PDO->prepare('SELECT "pessoa"...')
#1 /var/www/html/cad/vendor/zendframework/zendframework/library/Zend/Db/Adapter/Driver/Pdo/Statement.php(213): Zend\Db\Adapter\Driver\Pdo\Statement->prepare()
#2 /var/www/html/cad/vendor/zendframework/zendframework/library/Zend/Db/TableGateway/AbstractTableGateway.php(233): Zend\Db\Adapter\Driver\Pdo\Statement->execute()
#3 /var/www/html/cad/vendor/zendframework/zendframework/library/Zend/Db/TableGateway/AbstractTableGateway.php(208): Zend\Db\TableGateway\AbstractTableGateway->executeSelect(Object(Zend\Db\Sql\Select))
#4 /var/www/html/cad/vendor/zendframework/zendframework/library/Zend/Db/TableGateway/AbstractTableGateway.php(195): Zend\Db\TableGateway\AbstractTableGateway->selectWith(Object(Zend\Db\Sql\Select))
#5 /var/www/html/cad/module/Pessoa/src/Pessoa/Model/PessoaTable.php(18): Zend\Db\TableGateway\AbstractTableGateway->select()
#6 /var/www/html/cad/module/Pessoa/src/Pessoa/Controller/PessoaController.php(26): Pessoa\Model\PessoaTable->fetchAll()
#7 /var/www/html/cad/vendor/zendframework/zendframework/library/Zend/Mvc/Controller/AbstractActionController.php(83): Pessoa\Controller\PessoaController->indexAction()
#8 [internal function]: Zend\Mvc\Controller\AbstractActionController->onDispatch(Object(Zend\Mvc\MvcEvent))
#9 /var/www/html/cad/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php(468): call_user_func(Array, Object(Zend\Mvc\MvcEvent))
#10 /var/www/html/cad/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php(207): Zend\EventManager\EventManager->triggerListeners('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure))
#11 /var/www/html/cad/vendor/zendframework/zendframework/library/Zend/Mvc/Controller/AbstractController.php(117): Zend\EventManager\EventManager->trigger('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure))
#12 /var/www/html/cad/vendor/zendframework/zendframework/library/Zend/Mvc/DispatchListener.php(114): Zend\Mvc\Controller\AbstractController->dispatch(Object(Zend\Http\PhpEnvironment\Request), Object(Zend\Http\PhpEnvironment\Response))
#13 [internal function]: Zend\Mvc\DispatchListener->onDispatch(Object(Zend\Mvc\MvcEvent))
#14 /var/www/html/cad/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php(468): call_user_func(Array, Object(Zend\Mvc\MvcEvent))
#15 /var/www/html/cad/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php(207): Zend\EventManager\EventManager->triggerListeners('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure))
#16 /var/www/html/cad/vendor/zendframework/zendframework/library/Zend/Mvc/Application.php(313): Zend\EventManager\EventManager->trigger('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure))
#17 /var/www/html/cad/public/index.php(17): Zend\Mvc\Application->run()
#18 {main}

全局.php

return array(
 'db' => array(
     'driver'         => 'Pdo',
     'dsn'            => 'firebird:dbname=/opt/bancos/teste.fdb',   //array(PDO::ATTR_PERSISTENT => true),
     /*'driver_options' => array(
         PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
     ),*/
 ),
 'service_manager' => array(
     'factories' => array(
         'Zend\Db\Adapter\Adapter'
                 => 'Zend\Db\Adapter\AdapterServiceFactory',
     ),
 ),
 );
?>

local.php

<?php
return array(
    'db' => array(
            'username' => 'sysdba',
            'password' => 'masterkey',
    ),
);
?>

PessoaController.php

 public function indexAction()
 {

        return new ViewModel(array(
                'pessoas' => $this->getPessoaTable()->fetchAll(),
        ));


  }

PessoaTable.php

public function fetchAll()
 {
            try{
    $resultSet = $this->tableGateway->select();
            } catch(Exception $e){
              $e->getMessage();
            }
    return $resultSet;
  }

这里是getPessoaTable()方法

public function getPessoaTable()
 {
    if (!$this->pessoaTable) {
        $sm = $this->getServiceLocator();
        $this->pessoaTable = $sm->get('Pessoa\Model\PessoaTable');
    }
    return $this->pessoaTable;
 }

我已经在 php 中配置了 pdo_firebird.so。它显示在 phpinfo()

【问题讨论】:

  • 你能展示一下这个方法吗? getPessoaTable();

标签: php pdo zend-framework2 firebird firebird2.5


【解决方案1】:

错误的重要部分是:“Table unknown pessoa”。您正在从表 pessoa 中选择,根据 Firebird 不存在这样的表。 pessoa 在错误消息中是小写的事实表明您正在使用带引号的标识符。带引号的标识符在 Firebird 中区分大小写。不带引号的标识符是大写的,以使其不区分大小写。

所以这个错误要么意味着表确实不存在,要么 - 当您使用带引号的标识符时 - 表名实际上是 PESSOA。 Firebird 用于带引号/不带引号的标识符的规则将使 SELECT ... FROM pessoa 工作,但 SELECT ... FROM "pessoa" 失败。

我不了解 PDO,因此无法提供 PDO 特定的帮助,但我希望这可以为您缩小范围。

【讨论】:

  • 你说得对,麻烦就是你说的。因此,我的解决方案是将 getServiceConfig 方法中 Module.php 上的表名称从 pessoa 更改为 PESSOA。非常感谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 2012-07-12
  • 2012-11-26
  • 2022-12-17
相关资源
最近更新 更多