2009-07-25 54 views
3

我的問題是:數據庫查詢從類對象與PHP

我還可以做查詢的從像這樣的對象中:

$result = mysql_query ($q,$dbc) 
      or 
      trigger_error("Query: $q\n<br />MySQL Fout: " . mysql_error($dbc)); 

通過全球 DBConnection的變量$ DBC到構造函數

還是有更好的辦法嗎?

爲數據庫連接創建單例類,但是我看到很多人對它的消極看法。

我是新來製作物體,所以我不知道我是否可能必須這樣做,所有的一切 不同,我的意思是db。

謝謝,Richard

+0

該死的,我真的想知道他決定做什麼...... – 2009-07-28 03:33:56

回答

0

是的,你可以像這樣傳遞數據庫連接。

恕我直言,它使編碼有點困難,但測試更容易。

0

這裏是你將如何使用它:

class DB { 
    private $dbc; 

    public function __construct($dbConn) { 
     $this->dbc = $dbConn; 
    } 

    public function runQuery() { 
     mysql_query($query, $this->dbc); 
    } 
} 
+0

所以,這個類可以註冊一個像這樣的註冊類,只是它不是一個單例。 /***創建數據庫註冊表對象***/ // $ registry-> db = db :: getInstance(); **另外,如果我想運行一個查詢,那麼查詢應該是一個關閉runquery方法的參數,對**然後結果應該暴露在一個公共變量中,那麼,它是如何完成的? – Richard 2009-07-25 11:01:06

+0

include db_connect.php; /////設置全局$ dbc; ////// then ////// $ registry-> db = new DB($ dbc); *****然後,我創建了一個全局變量和一個對象。是不是很好,至於做什麼?**另外,顯然,我不能再使用觸發器錯誤了,我應該從查詢中扣除任何錯誤嗎? – Richard 2009-07-25 11:24:23

+0

這是我這樣做的方式。至少在發展過程中,我不會壓制錯誤。開發完成後,您可以@suppress錯誤並提供更多用戶友好的錯誤消息。 – EvilChookie 2009-07-28 19:04:27

0

傳遞變量。單身人士因爲某種原因而聲譽不佳 - 他們是爲了解決一個非常具體的問題而發明的,他們甚至沒有那麼做。不要將它們用作避免傳遞變量的方式,這是應該如何完成的。

0

我爲此目的使用單例類,但我仍然通過全局變量傳遞我的類變量。

首先創建單例類的原因是爲了確保只創建一個類的一個實例。在這種情況下,我想確保只創建一個數據庫實例。通過將類作爲單例類放置,任何編寫與此類接口的代碼的人都將獲得相同的連接。但是,它仍然不是全球化變量的替代品。

對於Singleton類,這裏有一個例子:

 
class datbasebase 
    { 
    static $class = false; 
    static function get_connection() 
    { 
     if(self::$class == false) 
     { 
      self::$class = new database; 
     } 
     else 
     { 
      return self::$class; 
     } 
    } 
    // This will ensure it cannot be created again. 
    protected function __construct() 
    { 
       $this->connection = mysql_connect(); 
    } 
     public function query($query) 
     { 
       return mysql_query($query, $this->connection; 
     } 
    } 

    $object = database::get_connection(); 

主要的原因我做這種方式,而不是簡單地繞過連接純粹是因爲我不想一遍又一遍重複的代碼。因此,在同一個類中查詢,連接和各種其他DB功能可以節省時間。

1

如果您正在尋找數據庫抽象,爲什麼不考慮使用Zend Framework提供的數據庫類。

它們還包括一種將適配器設置爲默認值的方法,使其可以快速執行操作。

除此之外,Zend_Db默認使用參數化查詢而不是老式的引用查詢,因此增加了安全性和安心。

使用全局變量幾乎是一個壞主意,它太容易被意外覆蓋!以及所有其他原因,你會發現不使用它們與快速谷歌。

製作與Zend框架分貝連接是一個單元,

$db = Zend_Db::factory('Pdo_Mysql', array(
'host'  => '127.0.0.1', 
'username' => 'webuser', 
'password' => 'xxxxxxxx', 
'dbname' => 'test' 

));

它確實如此簡單。然後您可以讓您的表類提供對單個表的快速訪問,或者將select和statement對象用於更高級的已加入查詢。另外,使用Zend Framework,您不必使用整個堆棧,只需使用數據庫組件即可。

如果您不希望爲此使用Zend Framework,我強烈建議您考慮替代方法,如像Doctrine這樣的ORM編寫自己的數據庫抽象。您將很快得到一個怪物,而ORM或Zend Framework有很多開發人員壓縮bug,甚至更多地報告這些bug。