2017-02-23 28 views
2

私はOOPの初心者ですが、まだ実験中です。 私はエラー致命的なエラー:キャッチされていないエラー:nullのメンバー関数のquery()を呼び出す

Fatal error: Uncaught Error: Call to a member function query() on null on the following line:

を得ている私は、DB接続がコアクラスから継承されていないことを認識しているが、私は、なぜ分かりません。

$user = $this->db->query("SELECT * FROM users WHERE id='".$user_id."' LIMIT 1"); 

Class.phpと

class Core { 
     public $db; 
     public $domain; 
     public $settings; 
     public function getDomain() { 
      return $this->domain; 
     } 
     function __construct($db,$domain) { 
      $this->db = $db; 
      $this->domain = $domain; 
      $this->getSettings(); 
     } 
     public function getSettings() { 
      $settings = $this->db->query("SELECT * FROM settings"); 
      $settings = $settings->fetch_object(); 
      $this->settings = $settings; 
     } 
    } 

    class User extends Core { 
     public $user; 
     function __construct($user_id) { 
      $this->setUser($user_id); 
     } 
     public function setUser($user_id) { 
      $user = $this->db->query("SELECT * FROM users WHERE id='".$user_id."' LIMIT 1"); 
      if($user->num_rows >= 1) { 
       $user = $user->fetch_object(); 
       $this->user = $user; 
      } 
     } 

のindex.php

$core = new Core($db,$domain); 
$user = new User($_SESSION['user_id']); 

明確化:

マイデシベル変数私のconfig.phpファイルから渡された私は、index.phpページの先頭サブクラスは、親クラスのサブクラスを構築する方法がありますある場合 config.phpの

$_db['host'] = 'localhost'; 
$_db['user'] = 'root'; 
$_db['pass'] = 'root'; 
$_db['name'] = 'social'; 
$db = new mysqli($_db['host'], $_db['user'], $_db['pass'], $_db['name']) or die('MySQL Error'); 
+0

セッションを開始しましたか?そのセッション配列には値が入っていますか? –

+0

はい、セッションは既に開始されています。私は、$ db変数が継承されていないか何かと関係があると思う。 –

+0

何か起こっている事がある。 $ core = new Core($ db、$ domain);を書く前に変数$ dbをどのように設定するかを教えてください。 – Yolo

答えて

1

問題呼び出された場合に使用されていない今、あなたのクラスを呼び出す方法の範囲内にあります。 Coreクラスの__construct()関数は$ db接続を想定しています。今、UserクラスはCoreクラスのコンストラクタ関数を呼び出してdb接続を開始する必要があります。データベース接続変数がすべてある場合

function __construct($db,$domain,$user_id) { 
    parent::__construct($db,$domain); 
    $this->setUser($user_id); 
} 

:これを行うには、あなたのユーザーコンストラクタを変えながら

$user = new User($db,$domain,$_SESSION['user_id']); 

コールこのような唯一のユーザークラス:だから、少なくとも一つの選択肢を持っています正しい(ホスト/ユーザー名/パスワード/ポート)、それは動作するはずです。

1

に含まれていますこの方法は、直接

class Core { 
    public $db; 
    public $domain; 
    public $settings; 
    public function getDomain() { 
     return $this->domain; 
    } 
    function __construct($db,$domain) { 
     $this->db = $db; 
     $this->domain = $domain; 
     $this->getSettings(); 
    } 
    public function getSettings() { 
     $settings = $this->db->query("SELECT * FROM settings"); 
     $settings = $settings->fetch_object(); 
     $this->settings = $settings; 
    } 
} 

class User extends Core { 
    public $user; 
    function __construct($user_id,$db,$domain) { 
     parent::__construct($db,$domain); 
     $this->setUser($user_id); 
    } 
    public function setUser($user_id) { 
     $user = $this->db->query("SELECT * FROM users WHERE id='".$user_id."' LIMIT 1"); 
     if($user->num_rows >= 1) { 
      $user = $user->fetch_object(); 
      $this->user = $user; 
     } 
    } 

とindex.phpの中だけ$user = new User($_SESSION['user_id'],$db,$domain);

0

継承後に親コンストラクタが設定されていません。

class Core { 
     public $db; 
     public $domain; 
     public $settings; 
     public function getDomain() { 
      return $this->domain; 
     } 
     function __construct($db,$domain) { 
      $this->db = $db; 
      $this->domain = $domain; 
      $this->getSettings(); 
     } 
     public function getSettings() { 
      $settings = $this->db->query("SELECT * FROM settings"); 
      $settings = $settings->fetch_object(); 
      $this->settings = $settings; 
     } 
} 

class User extends Core 
{ 
    public $user; 

    // parent:param Parameters add 
    function __construct($user_id,$db,$domain) { 
     // parent constructer call 
     parent::__construct($db,$domain); 
     $this->setUser($user_id); 
    } 
    public function setUser($user_id) { 
     $user = $this->db->query("SELECT * FROM users WHERE id='".$user_id."' LIMIT 1"); 
     if($user->num_rows >= 1) { 
      $user = $user->fetch_object(); 
      $this->user = $user; 
     } 
    } 
} 


$user = new User($_SESSION['user_id'],$db,$domain); 

例えば

がこれは大丈夫ではないですか? http://php.net/manual/en/language.oop5.decon.php

関連する問題