2016-04-18 26 views
-1

USERADMINという2つのクラスを作成し、adminを拡張しました。mysqlデータベースへのPDO接続のPHP oop継承

クラスUSERのオブジェクトを使用するとデータベースから必要なデータを取得できますが、ADMINオブジェクトで作業するときにデータを取得できません。次のように クラスは次のとおりです。最初は

 class USER 
     { 
      private $conn; 
      public function __construct() 
      { 
       $database = new Database(); 
       $db = $database->dbConnection(); 
       $this->conn = $db; 
      } 
      public function runQuery($sql) 
      { 
       $stmt = $this->conn->prepare($sql); 
       return $stmt; 
      } 

     ...some functions to query the DB 

     } 

class ADMIN extends USER 
{ 
private $conn; 

public function __construct() 
{ 
    $database = new Database(); 
    $db = $database->dbConnection(); 
    $this->conn = $db; 
} 
...some other functions to query the DB 
} 

私は、これは私の2回目の試行である管理者は、すべてではないprivateプロパティを継承することを読まなく、中にいるので、私は、コンストラクタが含まれていませんでしたどちらの場合でも私はこのエラーが発生しました:

Call to a member function prepare() on a non-object 私は行方不明ですか? THX

UPDATE:私はADMINクラスで例えば、この機能を持っている:これはあなたの問題を説明しなければならない

$stmt = $this->conn->prepare("SELECT * FROM appeals WHERE lecturer_id = :lecturer_id");

+2

ユーザーは管理音を私に後方に拡張します。管理者はユーザーのサブセットであり、他の方法ではありません。各クラスでデータベース接続を作成することは悪い呼び出しです。既存の接続を、重要なアプリケーションのクラスに渡します。 – ceejayoz

+0

@ceejayoz Yea私もそれを見ましたが、あなたがコードを見れば彼が実際にしていることではありません。 – RiggsFolly

+3

[Doctrine](http://www.doctrine- project.org/)と[Propel](http://propelorm.org/)は機能が完備されテスト済みですか? – tadman

答えて

3

http://php.net/manual/en/language.oop5.visibility.php

public function getAppeals($user_id){ 
    $stmt = $this->conn->prepare("SELECT * FROM appeals WHERE lecturer_id = :lecturer_id"); 
    $stmt->execute(array(':lecturer_id' => $user_id)); 
    $userRow = $stmt->fetchall(PDO::FETCH_ASSOC); 
    return $userRow; 
} 

エラーが発生した行はこれです

私有財産は定義されたクラスでのみ表示されます。しかし、それはあなたがこれらの変更を行った場合、それは

を動作するはずです。この parent::__construct();

のようなADMINクラスから親クラスのコンストラクタを実行すると仮定ADMINに表示されますので、それはprotectedが、それはUSERを拡張する任意のクラスからアクセスできるようになります作ります

class USER 
{ 
    //private $conn; 
    protected $conn; 

    public function __construct() 
    { 
     $database = new Database(); 
     $db = $database->dbConnection(); 
     $this->conn = $db; 
    } 
    public function runQuery($sql) 
    { 
     $stmt = $this->conn->prepare($sql); 
     return $stmt; 
    } 

...some functions to query the DB 

} 

class ADMIN extends USER 
{ 

    public function __construct() 
    { 
     parent::__construct(); 
    } 

    public function getAppeals($user_id){ 
     $stmt = $this->conn->prepare("SELECT * FROM appeals WHERE lecturer_id = :lecturer_id"); 
     $stmt->execute(array(':lecturer_id' => $user_id)); 

     $userRow = $stmt->fetchall(PDO::FETCH_ASSOC); 

     return $userRow; 
    } 
} 
+0

これは*おそらく*ここにあるでしょうし、 'protected 'を作るのは方法ですが、エラーはOPのコードには反映されません。' $ this-> conn'は 'USER'と'ADMIN'なので、両方でアクセス可能です。 'ADMIN'クラスはそれ自身の' $ conn'プロパティにアクセスでき、 'USER'は自身の' $ conn'プロパティにアクセスできますが、 'ADMIN'は' USER'の '$ conn'プロパティにアクセスできません。 'ADMIN'が' USER'から継承したメソッドを実行するとき、 'USER'lから' conn'を使用しようとします。その場合、それにアクセスすることはできません。私はそれがラインのどこかで起こっていると仮定しています。 – Mike

+0

私が間違っている場合は私を修正してください。 – Mike

+0

ここに私が意味するものの例があります:https:// 3v4l。org/UPc9k – Mike