mysqli_connect()失败需显式判断返回值是否为false,用mysqli_connect_error()获取错误信息;pdo需设置errmode_exception;重试应限次数、指数退避并加超时;错误信息严禁暴露给前端。

mysqli_connect() 返回 false 怎么办
直接检查返回值,别跳过这一步。很多开发者用 mysqli_connect() 后没判断返回值,结果后续调用 mysqli_query() 时爆出“expects parameter 1 to be mysqli, boolean given”这种错误。
- 必须用
if (!$conn)或=== false显式判断连接失败,mysqli_connect()成功返回对象,失败返回false - 错误信息要从
mysqli_connect_error()拿,不是mysqli_error() - 常见原因:用户名错、密码错、host 写成
localhost但 MySQL 只监听127.0.0.1(或反过来)、端口被防火墙拦住
pdo 连接失败时 exception 没抛出来
默认 PDO 不会把连接错误转成异常,得手动开开关。你写了 new PDO(...) 却没看到 PDOException,大概率是没设 PDO::ATTR_ERRMODE。
- 必须在构造后立刻设置:
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION) - 更稳妥的做法是把选项传进构造函数:
new PDO($dsn, $user, $pass, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]) - 注意:
PDO::ERRMODE_SILENT(默认)下出错只设错误码,PDO::ERRMODE_WARNING会触发 PHP 警告但不中断流程
连接失败后重试逻辑怎么写才不卡死
自动重试听着省心,实际容易埋雷——比如数据库根本没启动,你连试 5 次,每次等 3 秒,用户页面就挂那儿不动了。
PHP5学习对象教程由美国人古曼兹、贝肯、瑞桑斯编著,简张桂翻译,电子工业出版社于2007年12月1日出版的关于PHP5应用程序的技术类图书。该书全面介绍了PHP 5中的新功能、编程方法及设计模式,还分析阐述了PHP 5中新的数据库连接处理、错误处理和XML处理等机制,帮助读者系统了解、熟练掌握和高效应用PHP。
- 重试次数建议 ≤ 3,间隔用指数退避:第 1 次等 0.1s,第 2 次等 0.3s,第 3 次等 0.9s,别固定 sleep(1)
- 务必加超时控制:用
mysqli_real_connect()的connect_timeout参数,或 PDO DSN 加;connect_timeout=5 - 生产环境别在 Web 请求里重试;更适合放到队列任务或后台健康检查中做
错误信息能不能直接输出给前端
绝对不能。mysqli_connect_error() 可能暴露数据库版本、服务器路径、配置片段,扫一下就能猜出攻击面。
立即学习“PHP免费学习笔记(深入)”;
- 开发环境可显示详细错误,但需确认
display_errors = On且不在生产服务器上 - 线上必须关掉
display_errors,打开log_errors,把错误记到日志文件里 - 用户看到的只能是泛化提示,比如“服务暂时不可用”,而不是“Access denied for user 'app'@'10.0.2.5'”
mysqli_connect() 或 PDO 构造的处理逻辑。










