:通过异常机制(PDOException)报告连接和查询错误,代码中可以用 try...catch 进行捕获,异常信息中包含详细错误描述。
mysqli:使用属性和方法如 $mysqli->connect_error 和 $mysqli->connect_errno 来报告连接错误。错误不会自动抛出异常,需主动检测和处理。
换句话说,PDO 更依赖异常机制,而 mysqli 更依赖显式的错误检查。
try {
$pdo = new PDO('mysql:host=gitbox.net;dbname=testdb;charset=utf8', 'username', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "连接成功";
} catch (PDOException $e) {
echo "连接失败: " . $e->getMessage();
}
$mysqli = new mysqli('gitbox.net', 'username', 'password', 'testdb');
if ($mysqli->connect_error) {
die("连接失败: " . $mysqli->connect_error);
}
echo "连接成功";
注意: mysqli 通过 $mysqli->connect_error 获取连接错误消息,不会自动抛异常,必须手动检查。
PDO 用异常,代码结构较简洁且更安全。
mysqli 需要显式判断 $mysqli->connect_error 或 $mysqli->connect_errno。
如果你习惯用 try...catch 捕获异常,切换到 mysqli 后要调整错误处理逻辑。
PDO 通过 DSN 连接字符串里直接指定字符集,如 charset=utf8,mysqli 需要额外调用:
$mysqli->set_charset('utf8');
否则容易出现中文乱码问题。
PDO 支持的连接选项较多,mysqli 对部分选项支持有限。比如:
PDO 可以用 PDO::ATTR_PERSISTENT 来启用持久连接。
mysqli 需要额外处理或使用不同方式启用持久连接。
PDO 预处理语句使用 $stmt = $pdo->prepare($sql);,支持命名参数绑定。
mysqli 预处理语句用 $stmt = $mysqli->prepare($sql);,只支持问号占位符。
如果原有代码大量使用命名参数,需要重写为问号占位。
mysqli 默认不抛异常,若想模拟 PDO 的异常捕获,可以开启 mysqli 抛异常功能:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
开启后 mysqli 会抛 mysqli_sql_exception,更易统一错误处理。
项目 | PDO | mysqli |
---|---|---|
错误处理 | 异常捕获(try...catch) | 显式检查 $connect_error,可开启异常 |
连接字符串格式 | DSN 字符串(可设置 charset) | 单独设置 charset,需调用 set_charset() |
预处理参数绑定 | 支持命名参数 | 只支持问号占位符 |
持久连接支持 | 通过选项设置 | 需要不同方法实现 |
总之,从 PDO 切换到 mysqli 不仅仅是替换连接方式,更要全面考虑错误处理、编码设置、预处理语句等多方面差异,避免因不适应而导致隐性 bug。