2011-01-19 4 views
4

테스트 목적으로 PDO를 처음 사용하는 것은 처음입니다. 하지만 이상한 오류가 발생하여 검색 중이므로 이상하게 보입니다.PDO 연결 문제

Warning: PDO::prepare() [pdo.prepare]: SQLSTATE[00000]: No error: PDO constructor was not called in myfile.php on line 39 

로 라인 (39)을 고려 : 그것은 나에게 다음과 같은 오류를 보여줍니다

$db = new db(); 
$row = $db->prepare('SELECT * FROM test WHERE id = :id')->execute(array('id' => 1)); 
echo $row['value']; 

:

여기 내 데이터베이스 테스트 그리고 클래스

class db extends PDO 
{ 
    # Our instance. 
    private static $db = NULL; 

    # Calling the connector. 
    public static function connect() 
    { 
     if (self::$db === NULL) 
     { 
      $class = __CLASS__; 
      self::$db = new $class(); 
     } 
     return self::$db; 
    } 

    # Connector. 
    public function __construct() 
    { 
     $dns = 'mysql:dbname='.reg::get('db-name').';host='.reg::get('db-host'); 
     self::$db = new PDO($dns, reg::get('db-username'), reg::get('db-password')); 
     reg::delete('db-password'); 
    } 

    # Quick reporting 
    public function reportError($array) 
    { 
     if ($this->db != NULL) { echo 'Myself getting horny'; } // Just for testing, i'm not getting horny because of a mysql database connection! 
    } 

} 

다음 코드를 실행입니다

$row = $db->prepare('SELECT * FROM test WHERE id = :id')->execute(array('id' => 1)); 
+0

가 마토스, 그래, 내가 한 @andre. 똑같은 오류가 나타납니다. – Shoe

+0

왜 연결 방법이 있습니까? 왜'$ db'가'self :: $ db'가 아닌 null인지 검사하고 있습니까? 왜'self :: $ db = new db();'를하고 있습니까? –

+0

아직 문제가 아니지만 테이블/열 이름에 자리 표시자를 사용할 수 없습니다. 값으로 평가되는 무언가에 대해서만. – goat

답변

5

당신의 코드는

connect() 방법은 ... 당신이 너무 흥분이기 때문에 그것은 아마, 엉망 - 왜

if ($db === NULL) 

가 있어야한다? 거기입니다 :

if (self::$db === NULL) 

self::$db = new $class(); 

따라서 $class == __CLASS__ == db, 당신은 self::$db = new db();을하고 있습니다, 제대로 된 것 같지 않습니다.


PDO를 사용하여 테이블이나 열 같은 식별자를 준비 할 수 없습니다.

$db->prepare('SELECT * FROM :table WHERE id = :id')->execute(array('table' => 'test', 'id' => 1)); 

은 다음과 같아야합니다

$db->prepare('SELECT * FROM `test` WHERE id = :id')->execute(array('id' => 1)); 

이 시도 : 이것처럼

class db extends PDO 
{ 
    private static $db = null; 

    public static function singleton() 
    { 
     if (is_null(self::$db) === true) 
     { 
      self::$db = new PDO('mysql:dbname='.reg::get('db-name').';host='.reg::get('db-host'), reg::get('db-username'), reg::get('db-password')); 
     } 

     return self::$db; 
    } 
} 

:

$result = db::singleton()->prepare('SELECT * FROM `test` WHERE id = :id')->execute(array('id' => 1)); 

var_dump($result); 
+0

나는 그것을 고쳤지 만 나는 여전히 오류를 얻는다. 또한 어떻게 모든 PDO 메서드를 사용할 수 있어야하고 내가 db :: singleton()/db :: connect()를 호출하여 필요할 때마다 db singleton 인스턴스를 얻을 수 있어야합니까? – Shoe

+0

@Charlie Pigarelli : 내 업데이트를 확인하십시오. –

+0

@Charlie Pigarelli : PS, 당신은이 클래스를 필요로하지 않습니다. 간단한 함수는 같은 효과가 있습니다 :'function singleton() {static $ db = null; if (is_null ($ db)) {$ db = new PDO (/*...*/); } return $ db; }'. –

1

정적 (static) '연결'생성자가있어서 (정적) db 객체를 생성하고 반환합니다. 그러나 새로운 db()를 직접 만들 수도 있습니다.

prepare 문은 self::$db을 사용하므로 static made 변수를 호출하려고 시도합니다. 어떤 종류의 싱글 톤/정적 폼과 객체 폼을 결합하여 코드가 어떻게 작동해야하는지 잘 모르겠습니다.

하지만 그 문제 나는 오류 메시지와 관련이없는 것으로 보인다 이것은 당신의 대답은, 경우 완전히 모르겠지만, 난 당신이 테이블 이름을 전달할 수 있다고 생각하지 않습니다

+0

잠깐, 우리는 db :: getInstance() (<- singleton?)와 object form을 결합 할 수 없습니까? – Shoe

2

을 것 같다 바운드 매개 변수로. :table 대신 하드 코딩 된 테이블 이름을 넣으면 어떻게됩니까?

+0

이 팁을 주셔서 감사합니다. – Shoe

1

귀하의 싱글 톤 패턴은 모두 잘못되었습니다입니다. 생성자는 private이어야하며 $db의 정적 인스턴스를 사용해야합니다. 이 singleton example을 참조하십시오.