拓冰建站拓冰建站
首页 / 资讯中心 / 正文

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

很多 PHP 开发者写数据库连接靠的是“熟能生巧”别人怎么用我就怎么用。结果一查资料发现光是连 MySQL 就有好几种方式名字还容易搞混。更关键的是很多人其实没搞清楚——它们根本不是平级的关系。这篇不讲玄乎概念只讲清楚三件事这几种方式各自是什么、差别在哪、新项目到底该选谁。先记住一句话新项目默认选 PDO锁死 MySQL 的重度场景用 mysqli其它都是特例。01 先搞清楚它们不在一个层级先放下具体写法理解一个前提mysql、mysqli、PDO 这三样不是同一类东西。mysqlPHP 一个历史扩展提供 mysql_connect 这类老函数。mysqliPHP 原生扩展MySQL 专用面向对象 面向过程两套接口。PDOPHP 的数据库抽象层本身不直接连 MySQL要靠 pdo_mysql 驱动干活。一句话概括PDO 是“统一入口”mysqli 是“MySQL 专线”mysql 是“已经报废的老路”。这个认知一旦建立后面所有对比都顺了。02 mysql为什么它彻底退场了mysql_* 系列函数是最早的扩展。它有两个硬伤不支持预处理语句SQL 全靠字符串拼接非常容易被注入。官方在 PHP 5.5 标记废弃PHP 7.0 直接移除。也就是说任何运行 PHP 7 的环境里mysql_connect 根本不存在。现在网上还能看到的不少老教程用的就是这套照抄必报错。结论不用学、不用用遇到直接跳过。凡是教程还让你用 mysql_ 开头的函数说明这个教程本身已经过时。03 mysqliMySQL 专属能打但绑定mysqliMySQL 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为什么它是新项目的主流答案PDOPHP 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:hostlocalhost;dbnamedemo, 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_xdevapimysql_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 查看当前环境装了哪些扩展确认你的运行环境实际可用而不是想当然。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门