2017-02-20 71 views
1

我正在爲mysql創建一個「DB」類。 DB類將與我的項目中的其他類彙總。PHP - 在mysql類DB中打開一個或多個連接?

的index.php

$db = new DB(); 
$fo = new Foo($db); 

print_r($db->query("SELECT * FROM tbl")); 

print_r($fo->testSelect()); 

Foo類

class Foo { 

    /** 
    * Constructor 
    * Aggregate class db object 
    */ 
    public function __construct(DB $db) { 
     $this->db = $db; 
    } 

    public function test() { 
     return $this->db->query("select * from tbl"); 
    } 
} 

我的疑問是如何使用到數據庫的連接,使資源得到最佳利用。 在DB類中當我在構造函數中運行查詢(更新,選擇,...)或打開一次連接時,最好打開連接?

DB類(1)

if (!class_exists('DB')) { 

    class DB { 

     private function connect() { 
      $mysqli = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME, DB_PORT, DB_SOCKET); 
      if ($mysqli->connect_error) { 
       die("Connection failed: " . $mysqli->connect_errno . ' ' . $mysqli->connect_error); 
      } else { 
       $mysqli->set_charset(DB_CHARSET); 
      } 
      return $mysqli; 
     } 

     public function query($query) { 
      $db = $this->connect(); 
      $result = $db->query($query); 
      while ($row = $result->fetch_array(MYSQLI_ASSOC)) { 
       $results[] = $row; 
      } 
      $result->free(); 
      $db->close(); 
      return $results; 
     } 

     ..insert, update, delete function.. 
    } 
} 

DB類(2)

if (!class_exists('DB')) { 

    class DB { 

     private mysqli; 

     public function __construct() { 
      $this->mysqli = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME, DB_PORT, DB_SOCKET); 
      if ($this->mysqli->connect_error) { 
       die("Connection failed: " . $this->mysqli->connect_errno . ' ' . $this->mysqli->connect_error); 
      } else { 
       $this->mysqli->set_charset(DB_CHARSET); 
      } 
      return $this->mysqli; 
     } 

     public function query($query) { 
      $result = $this->mysqli->query($query); 
      while ($row = $result->fetch_array(MYSQLI_ASSOC)) { 
       $results[] = $row; 
      } 
      $result->free(); 
      return $results; 
     } 

     ..insert, update, delete function.. 

     public function __destruct() { 
      $this->mysqli->close(); 
     } 
    } 
} 

哪個是正確/更好的解決方案? 謝謝

+1

打開連接ONCE – RiggsFolly

回答

1

通常最好是最小化對數據庫的調用次數。打開和關閉每個查詢的數據庫連接都是浪費的開銷,並且如果有很多查詢會降低應用程序的速度。

另外,每次關閉連接時,都會丟失任何數據庫會話狀態。因此,如果您在一個查詢中設置了用戶變量,然後嘗試在另一個查詢中使用它們,則這將無法工作。或者,如果您設置了像SET TIME_ZONE = ...這樣的會話變量,那麼您將失去這個。而LAST_INSERT_ID()FOUND_ROWS()等功能將不起作用。

+0

非常感謝 –