Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 多个mysqli对象相互覆盖_Php_Mysqli - Fatal编程技术网

Php 多个mysqli对象相互覆盖

Php 多个mysqli对象相互覆盖,php,mysqli,Php,Mysqli,如果我创建两个到两台服务器的并行连接: $gw03 = new mysqli('gw03.example', 'user', 'pass', 'db'); $gw04 = new mysqli('gw04.example', 'user', 'pass', 'db'); if (!$gw03->connect_errno) { ... } else if (!$gw04->connect_errno) { ... } else { echo "Failed t

如果我创建两个到两台服务器的并行连接:

$gw03 = new mysqli('gw03.example', 'user', 'pass', 'db');
$gw04 = new mysqli('gw04.example', 'user', 'pass', 'db');

if (!$gw03->connect_errno) {
  ...
} else if (!$gw04->connect_errno) {
  ...
} else {
  echo "Failed to connect to gw03: (" . $gw03->connect_errno . ") " . $gw03->connect_error . PHP_EOL;
  echo "Failed to connect to gw04: (" . $gw04->connect_errno . ") " . $gw04->connect_error . PHP_EOL;
}
如果gw03可用,但gw04不可用,则结果如下

Failed to connect to gw03: (2002) No route to host
Failed to connect to gw04: (2002) No route to host

未能连接到$gw04似乎覆盖了$gw03。$gw03和$gw04不是独立的对象吗?这是怎么回事?

它们是独立的连接,但是connect\u errno方法“返回上次连接调用的错误代码”

每次尝试连接后,您都需要检查连接错误

$gw03 = new mysqli('gw03.example', 'user', 'pass', 'db');
# check $gw03 for connection error before attempting next connection
$gw04 = new mysqli('gw04.example', 'user', 'pass', 'db');

不幸的是,mysqli的设计很糟糕。属性
connect\u errno
connect\u error
不是真正的属性。它们只是全局变量的快捷方式。当第二次连接失败时,全局变量在内部被覆盖

这是一个很好的理由。当一个错误发生时,你的代码应该抛出一个错误,而不是一个警告或者无声的失败。应用程序应正确处理此错误,并将其登录到服务器上的安全位置。不要
尝试捕捉
向用户回显
错误消息

要启用mysqli错误报告,应在任何
新mysqli()/mysqli_connect()
之前添加以下行:


此设置将告诉mysqli在遇到错误时立即抛出异常。不再需要手动检查,也不再存在全局变量重写自身的问题。

uhh,面向对象的编写方式在这里并没有多大优势
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);