<p>PHP 8.2+ 中 mysql_* 函数已彻底移除,仅支持 mysqli 和 PDO;连接成功需三重验证:句柄状态、网络存活与权限,mysqli_connect() 后必须检查 false,PDO 构造须启用 PDO::ERRMODE_EXCEPTION 模式,并用 mysqli_ping() 或 getAttribute() 检测连接活跃性。</p>

PHP 8.2+ 环境下,mysql_* 函数已彻底移除,mysqli 和 PDO 是唯一可用路径;连接是否成功不能只看构造函数是否报错,必须结合连接句柄状态、网络存活与权限验证三重判断。
mysqli_connect() 后必须立刻检查 $conn 是否为 false
很多人写完 mysqli_connect() 就直接用,但 PHP 8.x 在连接失败时返回 false,而非抛异常。不判空会导致后续调用 $conn->query() 触发致命错误(Fatal error: Uncaught Error: Call to a member function query() on bool)。
-
mysqli_connect()返回false的常见原因:MySQL 服务未启动、端口被拒(如防火墙拦截 3306)、用户名密码错误、用户无远程/localhost 访问权限 - 正确写法是:
if (!$conn) { echo '连接失败:' . mysqli_connect_error(); },而不是依赖connect_error属性(该属性仅在面向对象方式中存在) - 过程式风格下,
mysqli_connect_error()和mysqli_connect_errno()是唯一可用的错误获取函数,且必须在mysqli_connect()调用后立即使用,延迟调用可能失效
PDO 构造失败时默认静默,必须显式开启异常模式
PDO 默认以静默模式运行:构造 PDO 对象失败时只返回 false,不会抛出 PDOException —— 这是 PHP 8 中最常被忽略的兼容性陷阱。
- 必须在
new PDO()后立即设置:$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION),否则query()失败也不会报错 - 更稳妥的做法是把连接和属性设置合并进构造参数:
new PDO($dsn, $user, $pass, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]) - 注意
PDO::ATTR_DEFAULT_FETCH_MODE等其他选项不影响连接判断,但若漏设ATTR_ERRMODE,整个连接状态就变成“看似成功、实则失效”
连接建立后还要用 mysqli_ping() 或 PDO::getAttribute() 验证活跃性
数据库连接可能在建立后因超时、网络中断或 MySQL 主动断连而失效。仅靠初始化成功不等于当前可执行查询。
立即学习“PHP免费学习笔记(深入)”;
- 对
mysqli:用mysqli_ping($conn)发送轻量心跳包,返回true表示连接仍活跃;它比执行SELECT 1更低开销,且不依赖任何数据库权限 - 对
PDO:没有内置 ping 方法,可用$pdo->getAttribute(PDO::ATTR_CONNECTION_STATUS)检查底层连接状态(返回字符串如"MySQL host info: localhost via TCP/IP"表示有效),但更常用的是捕获首次query()异常 - 生产环境建议封装成工具函数,例如:
function isDbAlive($conn) { return $conn instanceof mysqli ? mysqli_ping($conn) : ($conn instanceof PDO && $conn->getAttribute(PDO::ATTR_CONNECTION_STATUS) !== false); }
PHP 8.3+ 的 mysqli_real_connect() 不再接受空密码参数
如果你在升级到 PHP 8.3 后遇到 mysqli_real_connect(): Empty password specified 错误,不是密码真为空,而是传参顺序或默认值逻辑变了。
- 旧代码中用
mysqli_init() + mysqli_real_connect($link, ...)方式时,若第 4 个参数(密码)传null或空字符串,PHP 8.3 会严格拒绝 - 解决方法:显式传
''(空字符串)而非null,或直接改用new mysqli(...)构造,后者对空密码更宽容 - 这个变化容易被忽略,因为错误信息指向“password”,但实际是参数类型校验增强,和 MySQL 配置无关
真正可靠的连接检测,从来不是“跑通一次构造”,而是每次查询前确认句柄有效性,以及对 mysqli_ping() 或 PDO 异常的响应策略——尤其在长连接池或 CLI 守护进程中,连接老化比你想象得更快。



















