
本文详解如何在 PHP 中正确检测 MySQL 连接失败(包括数据库不存在、账号密码错误等场景),避免 mysqli_connect() 抛出未捕获异常导致脚本中断,并实现安全的用户重定向。
本文详解如何在 php 中正确检测 mysql 连接失败(包括数据库不存在、账号密码错误等场景),避免 `mysqli_connect()` 抛出未捕获异常导致脚本中断,并实现安全的用户重定向。
PHP 的 mysqli_connect() 函数在连接阶段失败(如主机不可达、端口拒绝、用户名/密码错误)时会返回 false,此时你的 if ($link === false) 判断有效;但当连接成功而选定数据库失败(如数据库名 'ts' 不存在)时,mysqli_connect() 仍会返回一个有效的 mysqli 对象——因为连接本身已建立,只是后续的数据库选择隐式失败,此时会直接抛出 mysqli_sql_exception(Fatal Error),导致脚本终止,header() 永远不会执行。
✅ 正确做法是:先建立不指定数据库的连接,再显式选择数据库并检查错误。以下是推荐的健壮写法:
<?php define('DBHOST', 'localhost');
define('DBUSER', 'root');
define('DBPASS', '');
define('DBNAME', 'ts');
// 第一步:仅连接 MySQL 服务(不指定数据库)
$link = mysqli_connect(DBHOST, DBUSER, DBPASS);
// 检查连接层是否失败(网络、认证等)
if ($link === false) {
error_log('MySQL connection failed: ' . mysqli_connect_error());
header('Location: dberror.php');
exit; // 必须 exit,防止后续代码执行
}
// 第二步:显式选择数据库
if (!mysqli_select_db($link, DBNAME)) {
error_log('Database selection failed: ' . mysqli_error($link));
header('Location: dberror.php');
exit;
}
echo "Connected successfully to database '" . DBNAME . "'";
?>
⚠️ 关键注意事项:
解析 MySQL 8.0 的 DDL 脚本,并将表结构导出为 Excel 格式。适用于用户需将 MySQL 的 `CREATE TABLE` 语句转换为结构化的 Excel 文件场景,导出内容包含字段名、数据类型、长度及精度等信息。支持多张表的批量处理,每张表对应 Excel 中的一个独立工作表。适用于数据库文档编写、数据字典生成及模式分析等任务。
- 永远在 header() 后调用 exit 或 die():否则重定向后脚本继续执行,可能暴露敏感信息或引发意外行为;
- 启用错误报告(开发环境):可在脚本开头添加 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 将所有 MySQL 错误转为异常,便于统一捕获(需配合 try...catch);
- 生产环境禁用错误显示:确保 display_errors = Off(php.ini),并通过 error_log() 记录问题,避免泄露数据库结构;
- 数据库名验证非必需但推荐:若数据库由用户输入,务必先校验其合法性(如正则 /^[a-zA-Z0-9_]+$/),防止 SQL 注入风险(虽此处不涉及查询,但属良好实践)。
总结:连接失败 ≠ 数据库选择失败。将二者分离处理,是实现可靠重定向的前提。使用 mysqli_select_db() 显式选库并检查返回值,可精准捕获“Unknown database”类错误,彻底解决重定向失效问题。










