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 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 不是独立的对象吗?这里发生了什么?

最佳答案

不幸的是,mysqli 的设计很糟糕。属性connect_errnoconnect_error不是真正的属性。它们只是全局变量的捷径。当第二个连接失败时,全局变量在内部被覆盖。
这是一个很好的理由 stop checking for mysqli errors manually .当发生错误时,您的代码应该抛出错误而不是警告或静默失败。此错误应由您的应用程序正确处理并记录在服务器上的安全位置。不要try-catchecho给用户的错误信息!
要启用 mysqli 错误报告,您应该在任何 new mysqli()/mysqli_connect() 之前添加以下行:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
此设置将告诉 mysqli 在遇到错误时立即抛出异常。不再需要手动检查,也不再有全局变量覆盖自身的问题。

关于php - 多个mysqli对象相互覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64359190/

相关文章:

PHP:返回数组中两个日期之间的所有日期

php - fatal error : Call to undefined function mysqli_connect() in. .. 将 PHP 5.4.22 和 MySQL 5.5 与 Apache 2.4.7 连接时

php - mysqli-> 查询结果中的未知列

php - 使用 PHP 将一个 AJAX POST 中的多行插入数据库?

php - PHP 中的 URL 解析和简化

php - 使用 php 对 mySQL 表进行分类

php - 如何连接mysql的两个表并将多行连接成一个单元格?

php - 带有条件的2个表的mysql查询

php - Grocery CRUD 回调函数如何工作?

c# - 将字节数组从 PHP 发布到 .NET WCF 服务