2017-02-20 9 views
1

Я создаю класс «DB» для mysql. Класс DB будет объединен с другими классами в моем проекте.PHP - открыть одно или несколько соединений в DB класса mysql?

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 Лучше открыть соединение, когда я запускаю запросы (обновления, выбирает, ..) или открывают соединение один раз в конструкторе?

БД класс (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

Открыть соединение ОДИН – RiggsFolly

ответ

1

В целом лучше всего минимизировать количество вызовов в базе данных. Открытие и закрытие соединения с базой данных для каждого запроса является бесполезным служебным и замедляет работу приложения, если есть много запросов.

Кроме того, каждый раз, когда вы закрываете соединение, вы теряете состояние сеанса базы данных. Поэтому, если вы задаете пользовательские переменные в одном запросе и затем попытаетесь использовать их в другом запросе, это не сработает. Или, если вы установили переменные сеанса, такие как SET TIME_ZONE = ..., вы потеряете это. И такие функции, как LAST_INSERT_ID() и FOUND_ROWS(), работать не будут.

+0

Большое спасибо –