news 2026/9/12 20:24:12

一文看懂 PHP 连接 MySQL 的几种方式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一文看懂 PHP 连接 MySQL 的几种方式

很多 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
$mysqli = new mysqli("localhost", "user", "pass", "demo");
$stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $id);
$stmt->execute();
$result = $stmt->get_result();

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
$pdo = new PDO(
"mysql:host=localhost;dbname=demo", "user", "pass",
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->execute([":id" => $id]);
$rows = $stmt->fetchAll();

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 查看当前环境装了哪些扩展,确认你的运行环境实际可用,而不是想当然。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 20:21:24

displaywidth:Go 终端显示宽度测量库的架构设计与工程实践

displaywidth:Go 终端显示宽度测量库的架构设计与工程实践 【免费下载链接】loki Like Prometheus, but for logs. 项目地址: https://gitcode.com/GitHub_Trending/lok/loki displaywidth 是一个高性能的 Go 库,用于测量字符串、UTF-8 字节切片和…

作者头像 李华
网站建设 2026/9/12 20:21:07

2026年AI就业爆发元年,小白也能入局的大模型学习路线!

本文深入分析了大模型方向的就业前景,指出2025-2026年是“大模型就业爆发元年”,围绕大模型催生了应用开发、RAG系统、Agent开发、模型微调及基础设施等岗位。文章强调大模型方向人才缺口巨大、薪资水平领先、国产大模型生态爆发及应用场景广泛&#xff…

作者头像 李华
网站建设 2026/9/12 20:19:32

车辆工程毕业论文怎么写?结构设计、仿真计算和性能验证这样串起来

车辆工程毕业论文怎么写?结构设计、仿真计算和性能验证这样串起来 车辆工程毕业论文最容易出现的问题,是“东西都做了,但论文不像论文”。三维模型有了、有限元云图有了、整车参数也整理了,甚至还能跑一些仿真,但正文往…

作者头像 李华
网站建设 2026/9/12 20:17:59

踩坑实录:Windows上QAIRT SDK本地编译环境搭建全攻略

系统环境:Windows 10/11 x86_64 SDK 版本:QAIRT 2.35 / 2.40 / 2.42 Python:3.10(本地编译) 3.11(云编译) 写在前面 在 Windows 上用 QAIRT SDK 做 LLM 模型的本地编译,是一段需要耐…

作者头像 李华
网站建设 2026/9/12 20:17:19

什么场景下使用 Function Calling,什么场景下使用 MCP?

一、 概念本质与技术栈层级对齐在当前的大模型应用开发中,许多开发者容易将“工具调用”与具体的实现机制混为一谈。事实上,Function Calling 与 MCP 分布在软件工程完全不同的层级上。┌───────────────────────────────…

作者头像 李华