
PHP 8.1 起,mysqli 默认启用异常报告模式,连接失败时不再设置 connect_errno,而是直接抛出 mysqli_sql_exception,导致原有错误判断逻辑失效。
php 8.1 起,mysqli 默认启用异常报告模式,连接失败时不再设置 `connect_errno`,而是直接抛出 `mysqli_sql_exception`,导致原有错误判断逻辑失效。
在 PHP 8.1 及更高版本中,mysqli 扩展的默认错误报告行为发生了重大变更:mysqli_report() 的默认值已从 MYSQLI_REPORT_OFF 改为 MYSQLI_REPORT_STRICT。这意味着——所有 MySQL 错误(包括连接失败)都会触发 mysqli_sql_exception 异常,而不再是静默设置 $mysqli->connect_errno 属性。因此,你原代码中依赖 if ($polaczenie->connect_errno != 0) 的判断将永远不成立(因为异常已在构造函数中抛出,后续代码根本不会执行),自然无法输出自定义错误信息。
✅ 正确做法:使用 try...catch 捕获异常
<?php require_once "connect.php";
try {
// 注意:@抑制符在此处已无实际意义(异常无法被@抑制)
$polaczenie = new mysqli($host, $db_user, $db_password, $db_name);
// 连接成功后处理表单数据
$login = $_POST['login'] ?? '';
$haslo = $_POST['haslo'] ?? '';
echo "It works!";
$polaczenie->close();
} catch (mysqli_sql_exception $e) {
// 获取标准错误码(如 1045、2002 等)
echo "Error: " . $e->getCode() . " — " . $e->getMessage();
}
?>
⚠️ 注意事项:
- @ 错误抑制符对异常无效,可安全移除;
- mysqli_sql_exception 继承自 RuntimeException,其 getCode() 返回 MySQL 错误码(如 2002 表示连接拒绝),getMessage() 返回详细错误描述;
- 若需兼容旧逻辑(例如维护遗留项目),可在连接前显式关闭严格模式:
mysqli_report(MYSQLI_REPORT_OFF); // 恢复传统 errno 模式
$polaczenie = @new mysqli($host, $db_user, $db_password, $db_name);
if ($polaczenie->connect_errno) {
echo "Error: " . $polaczenie->connect_error; // 推荐用 connect_error 而非 errno
}
? 最佳实践建议:始终优先采用异常处理方式。它更健壮、可追溯,并与现代 PHP 错误处理生态(如 PSR-3 日志、统一异常处理器)天然兼容。同时,请确保 connect.php 中的 $host、$db_user 等变量已正确定义,且数据库服务确实可访问——否则即使修复了异常捕获,也会因环境问题持续报错。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











