2010-07-08 4 views
2

안녕하세요, 저는 완전히 객체 지향 PHP에 익숙합니다 - 자습서를 읽었지만 실제로 PHP로 데이터베이스 작업을하는 것을 찾을 수 없습니다 수업.PHP 클래스 데이터베이스 상호 작용 (PDO 사용)

저는 간단한 뉴스 게시 클래스를 만들기 위해 노력하고 있습니다. 데이터베이스 등에서 게시물을 가져옵니다. 그러나 데이터베이스와 상호 작용할 때마다 오류가 발생합니다.

나는 PDO가 OO PHP를 사용하는 방법이라고 읽었습니다. 이 게시물에 설명 된대로이를 위해, 나는 데이터베이스 클래스를 개발했습니다 : Use of PDO in classes

class Database 
{ 
    public $db; // handle of the db connexion 
    private static $dsn = "mysql:host=localhost;dbname=test"; 
    private static $user = "admin"; 
    private static $pass = "root"; 
    private static $instance; 

    public function __construct() 
    { 
     $this->db = new PDO(self::$dsn,self::$user,self::$pass); 
    } 

    public static function getInstance() 
    { 
     if(!isset(self::$instance)) 
     { 
      $object= __CLASS__; 
      self::$instance=new $object; 
     } 
     return self::$instance; 
    } 

    // others global functions 
} 

그때 뉴스 게시물에 데이터를 검색하기 위해, 내 PHP 클래스를 사용하려고 :

<?php 
require_once "database.php"; 

class news extends Database 
{ 
    private $title; 
    private $author; 
    private $date; 
    private $content; 
    private $category; 


    function __construct($id) 
    { 
     $db = Database::getInstance(); 
     $query = $this->db->prepare("SELECT title, author, date, content, category FROM news WHERE id = :id LIMIT 1"); 
     $query->bindParam(":id", $this->id, PDO::PARAM_INT); 
     if ($query->execute()) 
     { 
      $result = $query->fetch(PDO::FETCH_OBJ); 

      $this->set_title($result->title); 
      $this->set_author($result->author); 
      $this->set_date($result->date); 
      $this->set_content($result->content); 
      $this->set_category($result->category); 
     } 
    } 
<...> 
?> 

때마다 나는 다음과 같은 오류가 발생하지만이 스크립트를 실행하려고 :

치명적인 오류 : 라인 16 /news.class.php에 비 객체()를 준비하는 멤버 함수를 호출

아이디어가 있으십니까?

+3

사이드 노트 : 데이터베이스 클래스를 싱글 톤 (즉, xx :: getInstance())으로 구현하려는 경우 __construct()를 비워 두거나 private로 설정하여 getInstance()가 액세스 할 수있는 유일한 방법입니다. 그렇지 않으면 재미있는 인스턴스화가있는 일반 클래스 일뿐입니다. – tadamson

답변

3
$db = Database::getInstance(); 
$query = $this->db->prepare(); 

당신은 $db 또는 $this->db 두 번을 사용해야합니다. $db은 로컬 함수의 변수입니다. $this->db은 클래스의 인스턴스 변수입니다. 그들은 동일하지 않습니다. 이 경우 $this->db이 존재하지 않으므로 오류 상태로 멤버 함수 prepare이 없습니다.

부모 생성자에 $this->db을 만들려고하지만 하위 클래스의 생성자를 재정의하므로 해당 코드가 실행되지 않습니다. 해당 코드를 실행하려면 parent::__constructor으로 전화해야합니다.

+0

오류가 변경되었습니다. prepare()가 존재하지 않아야한다. 데이터베이스 클래스에 $ db가 PDO 객체로 존재하기 때문이다. 치명적인 오류 : 정의되지 않은 메소드를 호출하십시오. : : /home1/centasmn/public_html/other_sites/test/news.class.php on line 16 – Ian

+0

'Database :: getInstance'는'Database' 인스턴스를 반환합니다. 클래스 자체는'prepare' 메소드를 가지고 있지 않습니다. '$ db-> db'는 당신이 찾고있는 객체이지만, 아마도 당신이 객체를 어떻게 사용하고 싶지는 않습니다. – deceze

+0

그 덕분에, 감사합니다! – Ian

-1

$ db = Database :: getInstance(); 이어야합니다 : $ db = new Database();

그리고이 줄 $ query = $ this-> db-> prepare(); 은 일 필요가 있습니다. $ query = $ db-> prepare();

다음이 $ query-> bindParam (": id", $ this-> id, PDO :: PARAM_INT); 은 이어야합니다. $ query-> bindParam (": id", $ id, PDO :: PARAM_INT);

왜 데이터베이스 클래스에서 getInstance() 함수가 필요한지 잘 모르겠습니다. The

새로운 데이터베이스()

당신에게 새로운 인스턴스를 줄 것이다.

+0

그는 getInstance를 사용하여 싱글 톤 패턴을 목표로한다고 생각합니다. – deceze

+0

네,하지만 달리기 전에 걷는 것이 좋을 것입니다! –

+0

아마도 -하지만 가파른 학습 곡선을 의미한다고해도 좋은 습관을 배우고 싶습니다. 답변을 주셔서 감사합니다! – Ian

3

디자인에 결함이 있습니다. 왜 뉴스가 데이터베이스를 확장합니까? 데이터베이스는 글로벌 데이터베이스 연결을 나타냅니다. 뉴스 테이블의 한 행은 데이터베이스 연결이 아닙니다. 그래서 그것을 상속해서는 안됩니다. 당신이해야 할 일은 "상속을 통한 부탁"원칙을 따르는 것입니다.

싱글 톤 확장은 좋은 생각이 아닙니다. 사실 싱글 톤은 코드를 모 놀리 식으로 만들기 때문에 일반적으로 나쁜 생각입니다.

기본적으로 객체 관계형 매핑입니다.기존 PHP ORM을 살펴 봐야하는데, Doctrine을 제안합니다.

+0

Doctrine만큼 큰 것을 사용하고 싶지 않으면 어떻게 데이터베이스/객체 상호 작용을 할 수 있습니까? – Wissem