Zend framework2 Zend Framework 2无法创建PostgreSQL db适配器

Zend framework2 Zend Framework 2无法创建PostgreSQL db适配器,zend-framework2,php,Zend Framework2,Php,我正在尝试使用最新的技术:Apache2.4、PHP5.4和PostgreSQL 9.1,为学习目的设置一个新的web应用程序 我选择使用Zend Framework 2进行开发 在我的主要模块中,我定义了此方法: public function getServiceConfiguration() { return array( 'factories' => array( 'adapter' => function ($sm) {

我正在尝试使用最新的技术:Apache2.4、PHP5.4和PostgreSQL 9.1,为学习目的设置一个新的web应用程序

我选择使用Zend Framework 2进行开发

在我的主要模块中,我定义了此方法:

public function getServiceConfiguration() {
    return array(
        'factories' => array(
            'adapter' => function ($sm) {
                $config = $sm->get('config');
                $adapter = new Adapter($config['db']);

                return $adapter;
            }
        ),
    );
}
$config['db']在my autoload/global.php中定义,其中包含:

return array(
    'db' => array(
        'driver' => 'PDO',
        'dsn' => 'pgsql:host=localhost;port=5436;user=root;password=myrootpwd',
    )
);
但是,当我尝试调用$serviceManager->get('adapter')时,我得到一个异常,它说:

致命错误:未捕获异常“Zend\Db\Adapter\exception\InvalidArgumentException”,在C:\Program Files\626Suite\application\library\Zend\ServiceManager\ServiceManager.php的第294行显示消息“提供的或实例化的驱动程序对象未实现Zend\Db\Adapter\DriverInterface”

Zend\Db\Adapter\Exception\InvalidArgumentException:提供的或实例化的驱动程序对象未在第80行的C:\Program Files\626Suite\application\library\Zend\Db\Adapter\Adapter.php中实现Zend\Db\Adapter\DriverInterface

调用堆栈:
0.0015 121600 1. {main}()C:\ProgramFiles\626Suite\application\data\script\install.php:0
0.5699 936080 2. Zend\ServiceManager\ServiceManager->get(字符串(7),???)C:\Program Files\626Suite\application\data\script\install.php:7
0.5700 936440 3. Zend\ServiceManager\ServiceManager->创建(数组(2))C:\Program Files\626Suite\application\library\Zend\ServiceManager\ServiceManager.php:277
0.5701 936520 4. Zend\ServiceManager\ServiceManager->createServiceViaCallback(类闭包,字符串(7),字符串(7))C:\Program Files\626Suite\application\library\Zend\ServiceManager\ServiceManager.php:353
0.5701 936672 5. 调用\u user\u func(类闭包,类Zend\ServiceManager\ServiceManager,字符串(7),字符串(7))C:\Program Files\626Suite\application\library\Zend\ServiceManager\ServiceManager.php:543
0.5701 936696 6. Age\Module->Age{closure}(类Zend\ServiceManager\ServiceManager,字符串(7),字符串(7))C:\Program Files\626Suite\application\library\Zend\ServiceManager\ServiceManager.php:543
0.6047 1024184 7. Zend\Db\Adapter\Adapter->\uu构造(类Zend\Config\Config,?,,?,,?)C:\Program Files\626Suite\application\module\Age\module.php:43

编辑:

我尝试将工厂修改为:

public function getServiceConfiguration() {
    return array(
        'factories' => array(
            'adapter' => function ($sm) {
                $config = $sm->get('config');
                $PDO = new \PDO($config['db']['dsn']);
                $adapter = new Adapter($PDO);

                return $adapter;
            }
        ),
    );
}
我首先得到一个错误,说数据库“root”不存在,但在将配置更改为:

return array(
    'db' => array(
        'driver' => 'PDO',
        'dsn' => 'pgsql:host=localhost;port=5436;dbname=postgres;user=root;password=myrootpwd',
    )
);

我又回到了之前描述的异常情况。

以下内容对我很有用:

/config/autoload/database.global.php

return array(
'db' => array(
    'driver'    => 'Pdo',
    'dsn'       => "pgsql:host=127.0.0.1;dbname=mydb",
    'username'  => 'username',
    'password'  => 'mypass',
),
);
/module/Application/module.php

public function getServiceConfiguration()
{
    return array(
        'factories' => array(
            'db_adapter' =>  function($sm) {
                $config = $sm->get('Configuration');
                $dbAdapter = new \Zend\Db\Adapter\Adapter($config['db']);
                return $dbAdapter;
            }
        ),
    );
}
然后你可以这样使用它:

$sql = "SELECT * FROM table WHERE field=?";
$statement = $this->adapter->query($sql);
$res =  $statement->execute(array($var));

以下是我的作品:

/config/autoload/database.global.php

return array(
'db' => array(
    'driver'    => 'Pdo',
    'dsn'       => "pgsql:host=127.0.0.1;dbname=mydb",
    'username'  => 'username',
    'password'  => 'mypass',
),
);
/module/Application/module.php

public function getServiceConfiguration()
{
    return array(
        'factories' => array(
            'db_adapter' =>  function($sm) {
                $config = $sm->get('Configuration');
                $dbAdapter = new \Zend\Db\Adapter\Adapter($config['db']);
                return $dbAdapter;
            }
        ),
    );
}
然后你可以这样使用它:

$sql = "SELECT * FROM table WHERE field=?";
$statement = $this->adapter->query($sql);
$res =  $statement->execute(array($var));

最后,我也解决了这个问题

解决方案是将当前使用的Zend Framework 2版本从beta4更新为直接从github下载的最新主版本


我想Zend代码本身可能有问题,因为现在它工作正常,没有更改代码或设置中的任何内容。

最后,我也解决了这个问题

解决方案是将当前使用的Zend Framework 2版本从beta4更新为直接从github下载的最新主版本


我想Zend代码本身可能有问题,因为现在它工作正常,没有在我的代码或设置中做任何更改。

顺便说一句:我以前从未使用过PDO,我直接从普通的mysql_query()切换到这个,但是,在检查完PHP文档后,DSN字符串应该是正确的..是的,顺便说一句:我以前从未使用过PDO,我直接从普通的mysql_query()切换到它,但是,在检查PHP文档后,DSN字符串应该是正确的。是的,这就是它的实现方式。我看到您将DSN与用户名和密码分开,这些不应该也放在DSN中吗?无论如何,我会尽快尝试您的解决方案。我发现您将DSN与用户名和密码分开,这些不应该也放在DSN中吗?无论如何,我会尽快尝试你的解决方案。