很多 PHP 开发者写数据库连接,靠的是“熟能生巧”:别人怎么用,我就怎么用。结果一查资料发现,光是连 MySQL 就有好几种方式,名字还容易搞混。
更关键的是,很多人其实没搞清楚——它们根本不是平级的关系。
这篇不讲玄乎概念,只讲清楚三件事:这几种方式各自是什么、差别在哪、新项目到底该选谁。
先记住一句话:新项目默认选 PDO,锁死 MySQL 的重度场景用 mysqli,其它都是特例。 |
01 先搞清楚:它们不在一个层级
先放下具体写法,理解一个前提:mysql、mysqli、PDO 这三样,不是同一类东西。
- mysql:PHP 一个历史扩展,提供 mysql_connect 这类老函数。
- mysqli:PHP 原生扩展,MySQL 专用,面向对象 + 面向过程两套接口。
- PDO:PHP 的数据库抽象层,本身不直接连 MySQL,要靠 pdo_mysql 驱动干活。
一句话概括:PDO 是“统一入口”,mysqli 是“MySQL 专线”,mysql 是“已经报废的老路”。这个认知一旦建立,后面所有对比都顺了。
02 mysql:为什么它彻底退场了
mysql_* 系列函数是最早的扩展。它有两个硬伤:
- 不支持预处理语句,SQL 全靠字符串拼接,非常容易被注入。
- 官方在 PHP 5.5 标记废弃,PHP 7.0 直接移除。
也就是说:任何运行 PHP 7+ 的环境里,mysql_connect 根本不存在。现在网上还能看到的不少老教程,用的就是这套,照抄必报错。
结论:不用学、不用用,遇到直接跳过。凡是教程还让你用 mysql_ 开头的函数,说明这个教程本身已经过时。 |
03 mysqli:MySQL 专属,能打但绑定
mysqli(MySQL Improved)是 mysql 的官方接班人,是 PHP 专门为 MySQL 设计的扩展。
它的优点:
- 支持预处理语句,从根上防注入。
- 支持事务、存储过程等 MySQL 特性。
- 面向对象、面向过程两种写法都支持,老项目迁移成本低。
- 提供 get_result() 这类强绑定的便捷方法。
它的缺点:
- 只认 MySQL 一家,换数据库(比如 PostgreSQL)代码就要重写。
- 错误处理默认偏传统,需要手动开启异常模式。
适合:项目确定只用 MySQL、想用足 MySQL 高级特性的场景。
mysqli 预处理示例:
php |
04 PDO:为什么它是新项目的主流答案
PDO(PHP Data Objects)是数据库抽象层。它本身不连数据库,而是通过不同驱动对接不同数据库:pdo_mysql 连 MySQL、pdo_pgsql 连 PostgreSQL、pdo_sqlite 连 SQLite。
它的优点:
- 一套写法换库不换代码(前提是不太依赖库特有功能)。
- 原生支持预处理、命名参数(:id),写法更清晰。
- 默认推荐异常模式(ERRMODE_EXCEPTION),错误处理更现代。
- Laravel、ThinkPHP、Symfony 这些主流框架底层几乎都是 PDO。
它的缺点:
- 部分 MySQL 特有功能支持得不如 mysqli 直接。
- 抽象层会屏蔽部分数据库差异,极端场景要额外处理。
适合:新项目、框架开发、以后可能换库、追求统一写法的场景。
PDO 预处理示例:
php |
05 底层还有个 mysqlnd,别被名字绕晕
mysqlnd 全称 MySQL Native Driver,是 PHP 自带的 MySQL 底层驱动。它既不是让你调函数做业务的 API,也不和 mysqli、PDO 平级——它是这两者底下真正干活的驱动。
PHP 默认编译就带 mysqlnd,相比老的 libmysqlclient,内存管理更好、性能更高。所以你只需要知道:当用 mysqli 或 pdo_mysql 时,背后多半就是 mysqlnd 在干活,不需要、也不能直接调用它。
06 MySQL 8 的新面孔:mysql_xdevapi
mysql_xdevapi 是 MySQL 8 推出的 X DevAPI 扩展,除了传统 SQL,还支持文档模型(把 MySQL 当 JSON 文档库用)和集合操作,适合关系型 + 非关系型的混合场景。
它需要单独用 PECL 安装,普通业务项目用得很少。如果只是常规增删改查,它不是必需品,知道有这回事即可。
07 一张表看清四种方式
方式 | 类型 | PHP7+ | 抽象层 | 预处理 | 换库 | 适用场景 |
mysql | 历史扩展 | 已移除 | 否 | 不支持 | — | 彻底废弃 |
mysqli | 原生扩展 | ✅ | 否 | 支持 | 需重写 | MySQL 专属项目 |
PDO + pdo_mysql | 抽象层 + 驱动 | ✅ | 是 | 支持 | 基本不用改 | 新项目、框架开发 |
mysql_xdevapi | 新扩展 | 需安装 | 否 | 支持 | — | MySQL 8 文档模型 |
08 选型判断框架
新项目 / 框架开发 → 默认 PDO。
项目锁死 MySQL 且重度依赖 MySQL 特性 → 用 mysqli。
MySQL 8 且要用文档模型 → 再看 mysql_xdevapi。
无论选哪个,都优先用预处理语句 + 参数绑定,这是防注入的基本盘。
另外可以用 php -m 查看当前环境装了哪些扩展,确认你的运行环境实际可用,而不是想当然。