2017-01-07 63 views
1

我來管理我所有的數據庫查詢一個PHP數據庫類:我是否需要爲每個查詢實例化Php數據庫類?

class DatabaseConnection() 
{ 
    private $link; 
    public $filter; 

    public function log_db_errors($error, $query) 
    { 

     if(MY_DEBUG) 
     { 
      echo $message; 
     } 
    } 


    public function __construct() 
    { 
     global $connection; 
     mb_internal_encoding('UTF-8'); 
     mb_regex_encoding('UTF-8'); 
     $this->link = new mysqli(MY_HOST, MY_USER, MY_PASS, MY_DB); 
     $this->link->set_charset("utf8"); 

     if($this->link->connect_errno) 
     { 
      $this->log_db_errors("Connect failed", $this->link->connect_error); 
      echo 'Server error. Please try again sometime. DB'; 
      exit(); 
     } 
    } 

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

    public function filter($data) 
    { 
     if(!is_array($data)) 
     { 
      $data = trim(htmlentities($data)); 
      $data = $this->link->real_escape_string($data); 
     } 
     else 
     { 
      $data = array_map(array('DB', 'filter'), $data); 
     } 
     return $data; 
    } 

    public function query($query) 
    { 
     $full_query = $this->link->query($query); 
     if($this->link->error) 
     { 
      $this->log_db_errors($this->link->error, $query); 
      $full_query->free(); 
      return false; 
     } 
     else 
     { 
      $full_query->free(); 
      return true; 
     } 
    } 

    public function my_table_exists_create($table, $variables = array()) { 
     $check = $this->link->query("SELECT * FROM '$table' LIMIT 1");   
     if($check) return true;   
     else { 
      if(empty($variables)) { 
       return false; 
       exit; 
      } 

      $sql = "CREATE TABLE IF NOT EXISTS ". $table; 
      $fields = array(); 
      $values = array(); 
      foreach($variables as $field) { 
       $fields[] = $field;  //$values[] = "'".$value."'"; 
      } 
      $fields = ' (' . implode(', ', $fields) . ')';  
      $sql .= $fields; 
      $query = $this->link->query($sql); 

      if($this->link->error) { 
       $this->log_db_errors($this->link->error, $sql); 
       return false; 
      } 
      else return true; 
     } 
    } 

    public function my_num_rows($query) 
    { 
     $num_rows = $this->link->query($query); 
     if($this->link->error) 
     { 
      $this->log_db_errors($this->link->error, $query); 
      return $this->link->error; 
     } 
     else 
     { 
      return $num_rows->num_rows; 
     } 
    } 

    public function exists($table = '', $check_val = '', $params = array()) 
    { 
     if(empty($table) || empty($check_val) || empty($params)) 
     { 
      return false; 
      exit; 
     } 
     $check = array(); 
     foreach($params as $field => $value) 
     { 

      if(!empty($field) && !empty($value)) 
      { 
       if($this->db_common($value)) 
       { 
        $check[] = "$field = $value"; 
       } 
       else 
       { 
        $check[] = "$field = '$value'"; 
       } 
      } 

     } 
     $check = implode(' AND ', $check); 

     $rs_check = "SELECT $check_val FROM ".$table." WHERE $check"; 
     $number = $this->my_num_rows($rs_check); 
     if($number === 0) 
     { 
      return false; 
     } 
     else 
     { 
      return true; 
     } 
     exit; 
    } 


    public function disconnect() 
    { 
     $this->link->close(); 
    } 

} 

我使用這個類來管理我所有的問題,就像插入到數據庫:

$database = new DatabaseConnection(); 
    $Item_Details = array(
     'item_title' => trim($_POST['title']), 
     'item_content' => trim($_POST['content']), 
     'item_updated' => date('Y-m-d H:i:s'), 
     'item_updatedby' => $my_loginid, 
    ); 
    $where_clause = array('itemid' => $itemid); 
    $updated = $database->as_update('my_item', $Item_Details , $where_clause, 1); 

現在我需要知道我可以使用這個類,而沒有太多的連接可能會減慢連接到服務器的連接,從而導致超時和連接太多。我以爲我可以使用一個全局變量

function my_constant_initialize() 
{ 
    global $databasecon; 
    $databasecon = new DatabaseConnection(); 
    return $databasecon; 
} 

所以請建議如何避免太多的連接。此外,以及告訴是否有必要爲每個查詢實例化數據庫類,或者我可以只調用一次,因爲我在我的php代碼中使用了大量的Include和require函數。

+1

不知道我明白,但爲了使用你的類的單個實例,你可以使用單例模式。 – Andreas

+0

安德烈亞斯請你指教我單身人士 –

+0

單身模式是你的班級首先檢查一個實例是否已經存在,如果它確實返回了這個實例而不是新建一個實例。其實很簡單,只需在網絡上搜索實施。 – isa424

回答

-1

在OOP PHP中,達到MySQL數據庫連接限制很困難,因爲如果腳本完成,它會破壞連接對象。爲了安全起見,在你的類中有一個destruct函數,並在腳本結尾處取消對象。如果你真的擔心達到連接上限,你可以進入MySQL並修改max_connection_limit,我認爲1000到更高,並增加緩衝池。

此外,您可能會考慮切換語言以使用Java,它具有稱爲「連接池」的技術。比PHP的版本更好。不,這與p_connect或PHP中的任何內容不一樣。

+0

修改連接限制是**不是**的解決方案,永遠。不要提高這個限制,有一個連接到MySQL的SET數量的進程。擁有一個析構函數對你的這個虛構類沒有任何作用。切換語言以建立連接池是您可以提供的最糟糕的建議。此外,PHP有連接池, –

+0

確定一個是你的看法,但對我來說,我選擇只與PHP一起工作 –

-1

至少您不必在每次打電話給班級時都發起連接。

要了解如何使用數據庫類而不必每次都實例化它,我們需要查看更多的代碼。已經提到的singleton模式是要走的路,但很難判斷它是否真的能改善你的代碼,而不知道你是如何編程的。

這說明你的類的實現爲singleton

class DatabaseConnection { 

    protected static $instance = null; 
    private $link; 
    public $filter; 

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

    protected function __construct() { 
     global $connection; 
     mb_internal_encoding('UTF-8'); 
     mb_regex_encoding('UTF-8'); 
     $this->link = new mysqli(MY_HOST, MY_USER, MY_PASS, MY_DB); 
     $this->link->set_charset("utf8"); 

     if($this->link->connect_errno) 
     { 
      $this->log_db_errors("Connect failed", $this->link->connect_error); 
      echo 'Server error. Please try again sometime. DB'; 
      exit(); 
     } 
    } 

    protected function __clone() { 

    } 

    // add your other methods 

} 

您可以通過使用

$databasecon = DatabaseConnection::getInstance(); 

通過實施這種方式連接調用,當你調用getInstance它檢查是否連接已經被初始化,所以你可以重新使用它。

您將__construct()設置爲protected,因此如果不使用getInstance()方法,則不能調用該類,對於__clone()也是如此。

+0

Hae Phillip我已更新我的帖子以顯示數據庫連接的代碼 –

相關問題