2013-06-27 67 views
1

所以我一直在編程一段時間,並決定了解OOP。我爲這個數據庫連接創建了這個類,但我不確定這是浪費代碼還是做事的好方法。我仍然不覺得我很瞭解OOP,但我會到達那裏,這只是練習。我想我的目標確實是儘可能多地將數據庫連接保留爲私有的,並且讓這個類可以像mysqli_close()那樣執行所有的清理操作。這是一個安全的OO php數據庫連接或浪費代碼

class db { 

private $db_user; 
private $db_pass; 
private $db_host; 
private $db_name; 
private $link; 
private $db_error; 

public function escape($string) { 

    return mysqli_real_escape_string($this->link, $string); 

} 

public function query($query) { 

    return = mysqli_query($this->link, $query); 

} 

function __construct() { 

    $this->db_error = 'Database Error'; 
    $this->db_user = 'root'; 
    $this->db_pass = ''; 
    $this->db_host = 'localhost'; 
    $this->db_name = 'test'; 

    $this->link = mysqli_connect($this->db_host, $this->db_user, $this->db_pass) or die($this->db_error); 
    mysqli_select_db($this->link, $this->db_name) or die($this->db_error); 

} 

function __destruct() { 

    mysqli_close($this->link); 

} 

}

編輯: 謝謝你,我要學習PDO的答案。

+1

'mysqli_free($ result);''在** return語句之後''將永遠不會運行。 – Aiias

+0

停止包裝原生擴展。另請注意'mysqli_free($ result);'永遠不會執行。 –

+7

爲什麼不使用本地mysqli OOP接口? –

回答

4

這不是本身錯誤本身,除非它不能支持預先準備好的陳述,因此可能會被利用,但它也不是一個有用的東西花時間; PHP's PDO class是您正在搜索的車輪。

0

我認爲它是一個好主意。將所有數據庫功能封裝在一個類中更好。

幾點建議:

  1. 發送連接參數的構造函數。因此,您可以在其他項目中輕鬆重複使用它。
  2. 使用準備好的語句,所以轉義字符串變得多餘
  3. mysqli_query也可能會失敗,您需要處理它。
0

我想對您的問題發表評論,但沒有足夠的聲望,所以我只想指出我的想法作爲答案。

你基本上正在做的是試圖寫一個包裝 - 這是絕對好的。但正如其他人指出的那樣,最好是封裝PDO函數,因爲它們提供了準備好的語句來處理任何SQL注入嘗試,並且將來會得到完全支持。

我看到的另一個問題是,您正在初始化並將您的MySQL登錄憑據存儲在對象內。由於他們現在在內存中,所以這些信息被暴露並且可以被檢索。

我建議您將MySQL登錄信息存儲在配置文件中,例如(.ini),並在調用mysqli_connect()函數時讀取它。不要將此數據存儲在類成員變量中。

如果您決定將登錄信息存儲爲局部變量(可能是爲了使代碼更清晰且具有有意義的變量名稱),請務必在調用mysqli_connect()後將它們清零。