2012-12-09 6 views
1

나는 현재 다음과 같이 DB 연결을 전달하기 위해 노력하고있어 :다른 클래스에 DB 연결을 전달하는 방법은 무엇입니까?

class Test { 
    public $user; 
    public $db; 

    function __construct() { 
     // connect to database 
     try { 
      $this->db = new PDO('mysql:host='.DB_HOST.';dbname='.DB_DATABASE.'', DB_USERNAME, DB_PASSWORD); 
      $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     } catch(PDOException $err) { 
      die($err->getMessage()); 
     } 
     $this->user = new User($this->db); 
    } 
} 

class User { 
    public $db; 

    function __construct($db) { 
     $this->db = $db; 
    } 

    // execute some query 
    $sql = "SELECT * FROM test"; 
    $sth = $this->db->prepare($sql); 
    $sth->execute(); 
    $result = $sth->fetch(); 
    if(!empty($result)) { 
     echo '<pre>'; 
     var_dump($result); 
     echo '</pre>'; 
    } 
} 

하지만 내가 얻을 : 치명적인 오류 : 개체가 아닌()를 준비하는 멤버 함수를 호출합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+0

거기에 구문 오류가 있다는 것을 확신합니다 :'} '도 있습니다. 많은. –

+0

'사용자'코드에 인라인 코드가 있습니다. 클래스는 변수 및 함수 정의 만 포함 할 수 있습니다. – symcbean

답변

1

전달 db-to-class 생성자 부분이 정확합니다.

하지만 코드화 된 방식으로 유효한 클래스 정의는 아닙니다. 이 코드 행 (// execute some query 다음)을 함수에 넣어야합니다. 코드의 줄은 User 클래스 내부에서 움직일 수는 있지만 함수 내부에는 존재하지 않습니다. 합법적 인 PHP가 아닙니다.

prepare() 또는 execute()를 호출 할 때마다 오류 상태도 확인해야합니다. 그들은 SQL 구문 오류와 같은 오류가 있거나 테이블이 존재하지 않으면 FALSE를 반환합니다.

class User { 
    public $db; 

    function __construct($db) { 
     if (! $db instanceof PDO) { die("What are you trying to pull anyway?"); } 
     $this->db = $db; 
    } 

    function doSomething() { 
     // execute some query 
     $sql = "SELECT * FROM test"; 
     $sth = $this->db->prepare($sql); 
     if ($sth === false) { 
      die(print_r($this->db->errorInfo(), true)); 
     } 
     $status = $sth->execute(); 
     if ($status === false) { 
      die(print_r($sth->errorInfo(), true)); 
     } 
     $result = $sth->fetch(); 
     if(!empty($result)) { 
      echo '<pre>'; 
      var_dump($result); 
      echo '</pre>'; 
     } 
    } 
} 
+0

함수에서 래핑 된 코드라도 여전히 같은 오류가 발생합니까? –

+1

이 코드를 테스트 한 결과 정상적으로 작동합니다. 오류가 앱의 다른 부분에서 발생하지 않았습니까? –

+1

또한 User 생성자에서 $ db의 유효성을 검사하는 것이 좋습니다. 위의 코드를 편집합니다. –

관련 문제