
本文详解如何安全检测 MySQL 数据库连接失败(包括数据库名错误、密码错误等场景),避免因未捕获异常导致的 Fatal Error,并通过 mysqli_connect() 的返回值逻辑配合 header() 实现用户友好跳转。
本文详解如何安全检测 mysql 数据库连接失败(包括数据库名错误、密码错误等场景),避免因未捕获异常导致的 fatal error,并通过 `mysqli_connect()` 的返回值逻辑配合 `header()` 实现用户友好跳转。
在 PHP 中使用 mysqli_connect() 时,连接失败并不总是返回 false——这是导致你代码失效的关键原因。当数据库名(如 'ts')不存在时,mysqli_connect() 默认会抛出 mysqli_sql_exception(尤其在启用了 MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT 模式时),而非返回 false,因此你的 if ($link === false) 判断根本不会执行,程序直接中断并报错。
✅ 正确做法是:禁用严格异常模式 + 显式检查连接结果 + 使用 mysqli_connect_error() 获取错误信息。以下是推荐的健壮写法:
<?php define('DBHOST', 'localhost');
define('DBUSER', 'root');
define('DBPASS', '');
define('DBNAME', 'ts');
// 关键:禁用 mysqli 的异常抛出(默认为 MYSQLI_REPORT_OFF)
mysqli_report(MYSQLI_REPORT_OFF);
$link = mysqli_connect(DBHOST, DBUSER, DBPASS, DBNAME);
// ✅ 此处 $link 仅在完全无法建立 TCP 连接(如主机不可达、端口拒绝)时为 false
// 数据库不存在、用户无权限等属于“连接成功但选择库失败”,$link 仍为有效对象
if ($link === false) {
// 网络级连接失败(如 MySQL 服务未启动、host 错误)
header('Location: dberror.php');
exit;
}
// 若 $link 是对象,说明已连上 MySQL 服务器,但需进一步验证数据库是否存在
if (!mysqli_select_db($link, DBNAME)) {
// 数据库选择失败(如 DBNAME 不存在或权限不足)
mysqli_close($link);
header('Location: dberror.php');
exit;
}
echo "Connected successfully";
?>
? 重要说明与注意事项:
- mysqli_connect() 的第四个参数 database_name 是可选的;即使传入错误库名,只要 MySQL 服务可达且账号有基础权限,函数仍返回连接对象(而非 false)。真正的“库不存在”错误发生在后续 mysqli_select_db() 或查询阶段。
- 不要依赖 mysqli_connect_error() 在 $link === false 之外调用——它仅在连接失败时有效;对于数据库选择失败,请用 mysqli_error($link) 配合 mysqli_select_db() 判断。
- 所有 header() 跳转前必须确保无任何输出(包括空格、BOM、echo),建议在跳转后立即 exit 防止后续代码执行。
- 生产环境建议记录错误日志(如 error_log("MySQL error: " . mysqli_error($link));),而非仅跳转,便于排查问题。
综上,连接失败处理应分两层:1)TCP 层连接失败 → $link === false;2)逻辑层数据库选择/权限失败 → mysqli_select_db() + 错误检查。只有这样,才能真正覆盖所有常见连接异常场景,并安全重定向用户。











