2010-06-25 119 views
4

我想通過在PHP中創建數據庫類來學習面向對象的編程更清晰。面向對象數據庫類

這就是我現在所擁有的。當我嘗試使用$ db-> query()調用它時,我得到一個有關$ mysqli作爲未定義變量的錯誤。

請解釋如何使變量$ mysqli定義。

<?php 

class phpDatabaseClass { 

public function __construct() 
{ 
    $mysqli = new mysqli(DBhost, DBusername, DBpassword, DBname); 
} 

public function query() 
{ 
    $sql = 'select * from users'; 
    $results = $mysqli->query($sql); 

    if(($results->num_rows) > 0) 
    { 
    echo 'We have: '.$results->num_rows; 
    } 
} 

} 

?> 

在另一個文件我正在實例化對象,然後調用一個函數是這樣的:

require 'phpDatabaseClass.php'; 
define('DBhost', 'localhost'); 
define('DBusername', 'root'); 
define('DBpassword', 'root'); 
define('DBname', 'campbellCustomCoatings'); 


$db = new phpDatabaseClass(); 
$db->query(); 

回答

2

你的mysqli實例將需要你的類中的一員,在這裏看看......

class phpDatabaseClass { 
private $mysqli; 
public function __construct() 
{ 
    $this->mysqli = new mysqli(DBhost, DBusername, DBpassword, DBname); 
} 

public function query() 
{ 
    $sql = 'select * from users'; 
    $results = $this->mysqli->query($sql); 

    if(($results->num_rows) > 0) 
    { 
    echo 'We have: '.$results->num_rows; 
    } 
} 

} 

而且,因爲你正在學習,嘗試擴展PDO類來了解繼承。

此外,稍切線,但通常以ALL_CAPS_WITH_UNDERSCORE_SEPARATORS命名常量。

此外,全局定義中的數據庫內容可能有風險,因爲每一段PHP都可以訪問它。我知道WordPress做它,但相信我的代碼質量是可疑的。它的受歡迎程度無疑是巨大的。

+0

我認爲定義常量的目的是爲了不能更改它們。你是否說這是有風險的,因爲它可以被改變或者因爲它可以被用戶查看?什麼會是更好的解決方案? – Catfish 2010-06-25 14:42:11

+0

@卡通只有風險,因爲它們是全球可用的。也看到這個問題http://stackoverflow.com/questions/593440/what-is-the-best-way-to-store-configuration-variables-in-php – alex 2010-06-26 00:02:17

2

我能看到的問題是試圖使$mysqli堅持同一個對象內部之間的函數調用。

什麼需要做的是將變量存儲爲實例變量,這是由$this->[VARIABLE]資格:

<?php 

class phpDatabaseClass { 

public function __construct() 
{ 
    $this->mysqli = new mysqli(DBhost, DBusername, DBpassword, DBname); 
} 


public function query() 
{ 
    $sql = 'select * from users'; 
    $results = $this->mysqli->query($sql); 

    if(($results->num_rows) > 0) 
    { 
    echo 'We have: '.$results->num_rows; 
    } 
} 

} 

?> 

我會考慮使用PDO

+0

您可能還需要定義屬性:P – alex 2010-06-25 05:23:07