2014-03-19 100 views
-1

我想學習更多的PHP,OOP和MySQLI,但我被卡住了。谷歌沒有幫助我,在這個網站上搜索也沒有給我任何結果。我有一個配置類連接到數據庫,並在另一個類我要運行一些查詢,但我得到這個錯誤與任何我想:簡單的PHP OOP和MySQLI

Fatal error: Call to a member function query() on a non-object in test.php on line 9

有人可以幫我嗎?

的config.php:

<?php 

class Database 
{ 
    private $host; 
    private $user; 
    private $password; 
    private $db; 
    private $mysqli; 


    function __construct() { 

     $this->host  = "private"; 
     $this->user  = "private"; 
     $this->pass  = "private"; 
     $this->data  = "private"; 

     $this->mysqli = new mysqli($this->host, $this->user, $this->pass, $this->data); 
    } 


    public function query($query) 
    { 
     return $this->mysqli->query($query); 
    } 
} 
?> 

test.php的:

<?php 
class Dummy 
{ 
    private $Database; 

     function __construct() 
    { 
     $this->Database = new Database(); 
     $this->Database->test = $this->mysqli->query("SELECT test FROM test")->fetch_object()->test; 
     } 
} 
?> 

的index.php:

<?php 

require 'config.php'; 
require 'test.php'; 

$test = new Database(); 
$test = new Dummy(); 

echo $this->Database->test; 
?> 
+0

什麼/在哪裏是'gw2Database'? – samayo

+0

檢查出該行。在當前('Dummy')類中查看你稱之爲'query'的事物 - >它是一個'mysqli'對象。但沒有什麼是所謂的。所以它不存在。 – Nanne

+0

從[這個回購](http://github.com/simon-eq/pdowrapper)學習,因爲我認爲你做錯了,如果你在你的課堂上硬編碼查詢 – samayo

回答

3

如何使用依賴注入,創建數據庫對象,然後通過構造將其作爲參數傳遞給類。

<?php 
class Database 
{ 
    private $host; 
    private $user; 
    private $password; 
    private $db; 
    private $mysqli; 


    function __construct($host,$user,$pass,$data) { 

     $this->host  = $host; 
     $this->user  = $user; 
     $this->pass  = $pass; 
     $this->data  = $data; 
     $this->mysqli = new mysqli($this->host, $this->user, $this->pass, $this->data); 
    } 

    public function query($query) 
    { 
     return $this->mysqli->query($query); 
    } 
} 
?> 

...

<?php 
class Dummy 
{ 

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

    function get_test_yada(){ 
     return $this->db->mysqli->query("SELECT test FROM test")->fetch_object()->test; 
    } 
} 
?> 

...

<?php 
$db = new Database('127.0.0.1','root','pass','database'); 
$dummy = new Dummy($db); 


$dummy->get_test_yada(); 
?> 

未經檢驗的,希望它有助於

+2

fyi,切換到PDO將使你構建一個可以完成任何類型的數據庫的數據庫超類,然後你可以通過這個構造將所需的數據庫類型傳遞給類,然後你的虛擬模型不會關心數據庫的具體情況,只是它具有數據庫。 –

0
$this->mysqli = new mysqli($this->host, $this->user, $this->pass, $this->data); 

如果連接失敗,你不能叫什麼在那個成員變量上。檢查您的連接是否先建立。

而且,如果你想訪問該變量,你應該公開它。

1

爲了美好,不要一次全部學習。你不會得到任何明智的結果。

每一個都是一個艱難而複雜的話題,其中OOP是最難的。

對於數據庫交互使用PDO預處理語句。

作爲面向對象的實踐,永遠不要從服務中擴展類,而是將其用作類變量。

class Dummy 
{ 
    protected $db; 

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

}