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