2012-06-18 4 views
0

내가 최신 기술을 사용하여 설치로 학습 목적을위한 새로운 웹 응용 프로그램을 시도하고는 PostgreSQL의 DB 어댑터를 만들 수 없습니다 내 주요 모듈 프레임 워크 (2)젠드 프레임 워크 (2)는

나는이 방법 정의 :

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

       return $adapter; 
      } 
     ), 
    ); 
} 

$의 설정을 [ 'DB']이 포함되어 내 자동로드/global.php에 정의되어

하지만 난 전화를 할 때 $ serviceManager->의 get ('어댑터') 내 말은 예외가 :

Fatal error: Uncaught exception 'Zend\Db\Adapter\Exception\InvalidArgumentException' with message 'The supplied or instantiated driver object does not implement Zend\Db\Adapter\Driver\DriverInterface' in C:\Program Files\626Suite\application\library\Zend\ServiceManager\ServiceManager.php on line 294

Zend\Db\Adapter\Exception\InvalidArgumentException: The supplied or instantiated driver object does not implement Zend\Db\Adapter\Driver\DriverInterface in C:\Program Files\626Suite\application\library\Zend\Db\Adapter\Adapter.php on line 80

Call Stack:
0.0015 121600 1. {main}() C:\Program Files\626Suite\application\data\script\install.php:0
0.5699 936080 2. Zend\ServiceManager\ServiceManager->get(string(7), ???) C:\Program Files\626Suite\application\data\script\install.php:7
0.5700 936440 3. Zend\ServiceManager\ServiceManager->create(array(2)) C:\Program Files\626Suite\application\library\Zend\ServiceManager\ServiceManager.php:277
0.5701 936520 4. Zend\ServiceManager\ServiceManager->createServiceViaCallback(class Closure, string(7), string(7)) C:\Program Files\626Suite\application\library\Zend\ServiceManager\ServiceManager.php:353
0.5701 936672 5. call_user_func(class Closure, class Zend\ServiceManager\ServiceManager, string(7), string(7)) C:\Program Files\626Suite\application\library\Zend\ServiceManager\ServiceManager.php:543
0.5701 936696 6. Age\Module->Age{closure}(class Zend\ServiceManager\ServiceManager, string(7), string(7)) C:\Program Files\626Suite\application\library\Zend\ServiceManager\ServiceManager.php:543
0.6047 1024184 7. Zend\Db\Adapter\Adapter->__construct(class 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; 
      } 
     ), 
    ); 
} 

내가 첫 번째 데이터베이스 "루트"존재하지 않는 없다는 오류를 얻었으나, 내 구성을 변경 한 후

이전에 설명한 예외가 다시 발생했습니다. 나를 위해

+0

덧붙여서 : 전에 PDO를 사용한 적은 한번도 없었 습니다만, 저는 보통의 mysql_query()에서 직접 전환하고 있습니다 만, AFAIK는 PHP 문서를 확인한 후에 DSN 문자열이 정확해야합니다. –

+0

그래, 이거 야. 그것이 완료된 방법입니다 http://www.php.net/manual/en/ref.pdo-pgsql.connection.php – michaelbn

답변

1

결국이 문제도 해결할 수있었습니다.

해결책은 현재 사용되는 Zend Framework 2 버전을 beta4에서 github에서 직접 다운로드 한 최신 마스터로 업데이트하는 것이 었습니다.

젠드 코드 어딘가에 문제가 있다고 가정합니다. 코드 또는 설정에서 아무 것도 변경하지 않고 제대로 작동하기 때문입니다.

5

다음 작품 :

/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)); 
+0

나는 당신이 DSN을 사용자 이름과 암호에서 분리했다는 것을 알고 있습니다. DSN에 DSN을두면 안됩니다 게다가? 어쨌든 가능한 빨리 해결책을 찾아 보겠습니다. –