2009-07-29 69 views
2

是否可以保留我所有與數據庫相關的配置(主機名,用戶名,密碼和數據庫)以及連接到並在單獨的類中選擇正確數據庫的功能?在單獨的類中配置MySQL數據庫

我想是這樣的:

class Database 
{ 
    var $config = array(
     'username' => 'someuser', 
     'password' => 'somepassword', 
     'hostname' => 'some_remote_host', 
     'database' => 'a_database' 
    ); 
    function __construct() { 
     $this->connect(); 
    } 
    function connect() { 
     $db = $this->config; 
     $conn = mysql_connect($db['hostname'], $db['username'], $db['password']); 
     if(!$conn) { 
      die("Cannot connect to database server"); 
     } 
     if(!mysql_select_db($db['database'])) { 
      die("Cannot select database"); 
     } 
    } 
} 

然後在另一個班我會在__construct函數的類使用:

require_once('database.php'); 
var $db_conn = new Database(); 

但這並不保存連接,它最終默認爲服務器本地數據庫連接。或者我必須在執行某些數據庫命令之前每次都執行數據庫命令?

+0

如果你有mysql。襪子問題,你可能想檢查這個問題的答案:http://stackoverflow.com/questions/1005485/warning-mysqlconnect-cant-connect-to-local-mysql-server – rojoca 2009-07-29 21:10:05

回答

7

我修改你的類工作,因爲你似乎是它期待:

<?php 
class Database 
{ 
    var $conn = null; 
    var $config = array(
     'username' => 'someuser', 
     'password' => 'somepassword', 
     'hostname' => 'some_remote_host', 
     'database' => 'a_database' 
    ); 

    function __construct() { 
     $this->connect(); 
    } 

    function connect() { 
     if (is_null($this->conn)) { 
      $db = $this->config; 
      $this->conn = mysql_connect($db['hostname'], $db['username'], $db['password']); 
      if(!$this->conn) { 
       die("Cannot connect to database server"); 
      } 
      if(!mysql_select_db($db['database'])) { 
       die("Cannot select database"); 
      } 
     } 
     return $this->conn; 
    } 
} 

用法:

$db = new Database(); 
$conn = $db->connect(); 

請注意,您可以撥打connect()多次,只要你喜歡,它將使用當前連接,或者創建一個,如果它不存在。這是好東西

此外,請注意,每次您將實例化爲數據庫對象(使用新的)時,您將創建一個到數據庫的新連接。我建議你考慮實現你的數據庫類作爲Singleton或將它存儲在Registry以供全局訪問。

你也可以用骯髒的方式做到這一點,並將它推到$ GLOBALS中。

編輯

我把修改你的類實現Singleton模式,並按照PHP5 OOP慣例的自由。

<?php 
class Database 
{ 
    protected static $_instance = null; 

    protected $_conn = null; 

    protected $_config = array(
     'username' => 'someuser', 
     'password' => 'somepassword', 
     'hostname' => 'some_remote_host', 
     'database' => 'a_database' 
    ); 

    protected function __construct() { 
    } 

    public static function getInstance() 
    { 
     if (null === self::$_instance) { 
      self::$_instance = new self(); 
     } 
     return self::$_instance; 
    } 

    public function getConnection() { 
     if (is_null($this->_conn)) { 
      $db = $this->_config; 
      $this->_conn = mysql_connect($db['hostname'], $db['username'], $db['password']); 
      if(!$this->_conn) { 
       die("Cannot connect to database server"); 
      } 
      if(!mysql_select_db($db['database'])) { 
       die("Cannot select database"); 
      } 
     } 
     return $this->_conn; 
    } 

    public function query($query) { 
     $conn = $this->getConnection(); 
     return mysql_query($query, $conn); 
    } 
} 

用法:

$res = Database::getInstance()->query("SELECT * FROM foo;"); 

$db = Database::getInstance(); 
$db->query("UPDATE foo"); 
$db->query("DELETE FROM foo"); 
0

您當然可以將您的連接信息保存在單獨的文件中。

只需在您的connect()函數中將連接對象 - $ conn保存在類變量中即可。然後您可以在呼叫中重複使用它。

0

在你的方法connect()中$ conn只是一個局部變量,只存在於該方法的作用域中。只要方法返回,就不會有(其他)連接資源引用,並且它將被收集/處理。 你需要至少

$this->conn = mysql_connect(...) 
+0

我只是試圖將其添加到數據庫類: var $ conn; 和Database類中的connect()方法: $ this-> conn = mysql($ db ['hostname'],$ db ['username'],$ db ['password']); 在另一個類的__contruct中,我有一個類變量$ db,該類在__construct中填充了該類: $ this-> db = new Database(); 我試圖進行查詢時仍然出現此錯誤:無法通過套接字'/var/run/mysqld/mysqld.sock'連接到本地MySQL服務器(2) – trobrock 2009-07-29 20:27:06

0

這裏附帶了PDO例如單元素。感謝@hodobave

<?php 

/** 
* DB Connection class 
* Singleton pattern 
* An single instance of DB connection is created 
**/ 

class Db{ 

    protected static $_instance = null; 
    protected $_conn; 

    protected $_config = [ 
     'username' => 'root', 
     'password' => '', 
     'hostname' => 'localhost', 
     'database' => 'news', 
    ]; 
    protected function __construct(){ 

    } 

    public function getInstance(){ 
     if(null === self::$_instance){ 
      self::$_instance = new self(); 
     } 
     return self::$_instance; 
    } 

    public function getConnection(){ 
     if(is_null($this->_conn)){ 
      //connect here 
      $db = $this->_config; 
      $dsn = "mysql:host={$db['hostname']};dbname={$db['database']}"; 
      $this->_conn = new PDO($dsn, $db['username'], $db['password']); 
     } 
     return $this->_conn; 
    } 

    public function query($sql){ 
     $args = func_get_args(); 
     array_shift($args); 
     $statement = $this->getConnection()->prepare($sql); 
     $statement->execute($args); 
     return $statement->fetchAll(PDO::FETCH_OBJ); 
    } 
} 



$res = Db::getInstance(); 
$users = $res->query("SELECT * FROM `user` WHERE id=?",1); 
print_r($users); 
?> 
相關問題