1

我正在使用 mysqli 使用 OOP 方法创建与数据库的连接。有没有办法让它表现得像得到 $new_link=false 的 mysql_connect,让它为这个脚本中的每个人返回相同的连接,即使他们创建了一个新实例?

这是我如何连接的示例:

     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 和/或使用依赖注入,但想知道这是否可以直接在连接请求中完成。

4

3 回答 3

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 都将引用同一个对象,因此是同一个连接。

于 2013-07-08T07:51:20.853 回答
-1

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

不,那是不可能的。
不过,我认为它没有太大问题。

于 2013-07-08T09:41:27.080 回答
-2

来自(http://php.net/manual/en/mysqli.construct.php

通过 p 前置主机:打开一个持久连接。mysqli_change_user() 在从连接池打开的连接上自动调用。
于 2013-07-08T08:06:39.840 回答