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);