mysqli:在调用构造函数两次时返回相同的连接,如$ new_link = false;

时间:2013-07-08 07:37:22

标签: php mysql database mysqli

我正在使用mysqli使用OOP方法创建与数据库的连接。有没有办法让它像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和/或使用依赖注入,但是想知道是否可以直接在连接请求中完成。

3 个答案:

答案 0 :(得分: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 :(得分:0)

  

我想知道是否可以直接在连接请求中完成此操作。

不,那是不可能的 我发现它没有太多问题。

答案 2 :(得分:-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.