90%的新项目应直接用pdo,因其能规避sql注入、数据库迁移困难和错误静默失败三类硬坑;仅当需mysql特有功能或维护纯mysql老系统时才选mysqli。

新项目直接用 PDO,除非你明确需要 MySQLi 特有功能
90% 的新项目该用 PDO,不是因为它“更高级”,而是它能避开三类硬坑:SQL 注入、数据库迁移困难、错误静默失败。比如 PDO::ATTR_ERRMODE 默认设为 PDO::ERRMODE_EXCEPTION 后,任何连接或查询失败都会抛出 PDOException,不会让请求无声挂掉;而 mysqli 的 $mysqli->connect_error 必须手动检查,漏一次就可能线上静默故障。
以下情况才考虑 mysqli:
- 项目已重度依赖 MySQL 8.0+ 特性,如异步查询(
mysqli::poll())、不可见索引、角色管理,且确认永不换库 - 团队在维护一个纯 MySQL 老系统,且已有大量面向过程写法的
mysqli_connect()代码,迁移成本过高 - 需要调用
mysqli::real_connect()复用连接,或使用嵌入式 MySQL 服务(极少见)
字符集和错误模式必须在 new 之后立刻设置
这两个配置不是“可有可无的优化”,而是决定行为的关键开关,且必须在实例化后第一行就设,封装进工厂函数再 set 就无效。
PDO 示例(关键顺序不能错):
$pdo = new PDO("mysql:host=localhost;dbname=test;charset=utf8mb4", $user, $pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 必须紧跟 new
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); // 关闭模拟预处理,否则 LIKE ? 会报错
mysqli 示例:
$mysqli = new mysqli("localhost", $user, $pass, "test");
$mysqli->set_charset("utf8mb4"); // 必须在任何 query() 前调用,否则中文变问号且不报错
if ($mysqli->connect_error) { die("连接失败: " . $mysqli->connect_error); } // 必须手动检查
注意:charset=utf8mb4 在 DSN 里只是初始化连接字符集,set_charset() 是影响后续所有查询的上下文,二者互补,不能只选其一。
预处理语句的安全性差异容易被低估
PDO 默认开启模拟预处理(PDO::ATTR_EMULATE_PREPARES = true),意味着 SQL 是 PHP 拼好再发给 MySQL —— 这会让 WHERE name LIKE ? 传入 '%abc%' 直接报错;关掉后才能真正走服务端 prepare,但云数据库(如阿里云 RDS)可能默认禁用服务端 prepare,此时会静默退化回模拟模式,且不警告。
mysqli 没有模拟模式,它的 prepare() 总是走服务端,更确定,但代价是不支持命名参数,只能用问号占位符,参数顺序错一位就查错数据。
常见陷阱:
- 混用
bindValue()和bindParam():后者绑定变量引用,适合循环复用同一语句;前者绑定当前值,更安全,别误以为后者“更高效”就滥用 - 在事务中穿插
mysqli_query()和PDO查询:事务隔离失效,数据不一致,且资源泄漏难排查 -
PDO::lastInsertId()在多库场景下可能返回错库 ID;而$mysqli->insert_id绑定在连接实例上,更确定
跨数据库或长期维护项目,PDO 是唯一合理选择
如果未来可能切换 PostgreSQL 或 SQLite,或者项目生命周期超过 2 年,PDO 是事实标准。换库只需改 DSN 字符串和少量 SQL 差异(如分页用 LIMIT 还是 OFFSET),其他代码几乎不动。而 mysqli 一旦写死,所有 prepare()、bind_param()、get_result() 都得重写。
框架层也印证这点:Laravel、Symfony、CodeIgniter 等主流框架底层都基于 PDO 封装,不是因为“爱用”,而是它提供的抽象能力让上层逻辑与数据库解耦。你自己手写 DAO 层时,若还选 mysqli,等于主动放弃可维护性底线。
最常被忽略的一点:PDO 的命名参数(:name)在复杂动态查询中可读性碾压问号占位符,10 个参数以上时,bind_param("ssisiiissi", ...) 的类型字符串和参数顺序极易出错,且无法跳过可选条件。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











