
PHP 8.1 起,mysqli 默认启用异常报告模式,导致 connect_errno 检查失效;需改用 try-catch 捕获 mysqli_sql_exception,或显式关闭异常报告以恢复旧版错误状态检查机制。
php 8.1 起,mysqli 默认启用异常报告模式,导致 `connect_errno` 检查失效;需改用 try-catch 捕获 `mysqli_sql_exception`,或显式关闭异常报告以恢复旧版错误状态检查机制。
在 PHP 8.1 及更高版本中,mysqli 扩展的默认错误报告行为发生了重大变更:连接失败时不再仅设置 $mysqli->connect_errno 和 $mysqli->connect_error 属性,而是直接抛出 mysqli_sql_exception 异常。这意味着你原先依赖的条件判断:
if ($polaczenie->connect_errno != 0) {
echo "Error: " . $polaczenie->connect_errno;
}
将永远不会执行——因为连接失败时脚本会在 new mysqli(...) 处立即中断并抛出未捕获异常,后续代码(包括 if 判断)根本不会运行。
✅ 正确做法是使用异常处理机制:
<?php require_once "connect.php";
try {
// @ 符号会抑制 Notice/Warning,但无法屏蔽异常!建议移除 @,让异常清晰暴露
$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 "Connection Error: [" . $e->getCode() . "] " . $e->getMessage();
// 示例输出:Connection Error: [2002] No such file or directory
}
?>
⚠️ 注意事项:
- @ 错误控制符对 Exception 完全无效,它仅抑制 PHP 的 E_WARNING/E_NOTICE 等错误级别,不作用于异常。因此 @new mysqli(...) 不会影响异常抛出,反而掩盖了潜在问题,建议移除。
- 若你确实需要兼容旧逻辑(例如遗留项目迁移过渡期),可在连接前禁用异常报告:
mysqli_report(MYSQLI_REPORT_OFF); // 恢复 PHP 8.0 及之前的行为 $polaczenie = new mysqli($host, $db_user, $db_password, $db_name); if ($polaczenie->connect_errno) { echo "Error: " . $polaczenie->connect_errno . " - " . $polaczenie->connect_error; } - 始终对 $_POST 数据做空值检查(如 ?? ''),避免未定义索引警告;生产环境还应进行输入验证与 SQL 防注入处理(勿直接拼接查询)。
? 总结:PHP 8.1+ 的 mysqli 是「面向异常设计」的。拥抱 try/catch 不仅符合当前规范,更能实现更健壮的错误分类处理(如区分连接失败、查询失败、权限错误等),是现代 PHP 数据库编程的标准实践。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











