2013-07-08 2 views
1

Я использую mysqli для создания соединения с базой данных с использованием подхода ООП. Есть ли способ заставить его вести себя как mysql_connect, который получил $ new_link = false, заставляя его возвращать одно и то же соединение для всех в этом скрипте, даже если они создали новый экземпляр?

Это пример того, как я подключения:

 class DB extends mysqli { 

       public function __construct() { 
        $server_params = $this->server_params; 
        if (!$server_params) { 
         throw Exception('No server params for server: '.$server); 
        } 
        @parent::__construct($server_params['host'], $server_params['user'], $server_params['pass'], $server_params['db'], $port, $socket); 
        if ($this->connect_errno != 0){ 
         throw new Exception($this->connect_error, $this->connect_errno); 
        }     
       } 
    } 

И делает два экземпляра просто звоню

$db = new DB; 

дважды из разных пространств имен в том же сценарии.

Я знаю, что могу создать инъекцию singelton и/или использовать зависимостей, но задавался вопросом, можно ли это сделать непосредственно в запросе на соединение.

+1

Да, это так. Почему бы вам не проверить его самостоятельно? –

+0

Перефразированный вопрос, я на самом деле предположил, что это так, и задавался вопросом, есть ли способ «преодолеть» это. – Noam

+0

+1 для правильного кода подключения. Откуда вы это узнали? Это редко можно увидеть в Stack Overflow. Единственное, что у вас есть, это дублированный вызов конструктора –

ответ

0

Как правило, не так уж хорошо, что два разных объекта воплощают одно и то же соединение с базой данных SQL. Если вы начинаете транзакцию в одном случае, что происходит, если вы совершаете в другом? Если они представляют разные сеансы в одной и той же базе данных, это хорошо, потому что сеансы изолированы друг от друга (каждый сеанс может начать свою собственную транзакцию, не рискуя попасть в другое состояние, не попадая в бессмысленное состояние). В этом случае вы просто создадите новые экземпляры для каждого открытого соединения.

$db1 = new mysqli("example.com", "user", "password", "database"); 
$db2 = new mysqli("example.com", "user", "password", "database"); 

Если вам нужно несколько ссылок на одной и той же связи и сессии, то все, что вам нужно сделать, это:

$db1 = new mysqli("example.com", "user", "password", "database"); 
$db2 = $db1; 

Оба $ DB1 и $ db2 будет ссылаться на тот же объект и, следовательно, такой же связь.

-1

Из (http://php.net/manual/en/mysqli.construct.php)

 
Prepending host by p: opens a persistent connection. mysqli_change_user() is automatically called on connections opened from the connection pool. 
+1

Постоянное соединение не имеет ничего общего с созданием разных подключений в одном экземпляре. –

0

мне было интересно, если это может быть сделано в запросе соединения напрямую.

Нет, это невозможно.
Я не вижу в этом никакой проблемы.