【SQL知识】PDO 和 MySQLi 的区别
简介
PDO (PHP Data Objects) 和 MySQLi (MySQL Improved) 都是 PHP 中用于数据库操作的扩展,都支持预处理语句,但有一些重要区别:
主要区别
-
数据库支持
-
PDO:支持多种数据库(MySQL, PostgreSQL, SQLite, Oracle 等)
-
MySQLi:仅支持 MySQL 数据库
-
-
API 风格
-
PDO:提供一致的面向对象接口(也支持过程式)
-
MySQLi:提供面向对象和过程式两种接口
-
-
预处理语句
-
PDO:命名参数和位置参数都支持
-
MySQLi:只支持位置参数(?)
-
-
错误处理
-
PDO:支持异常处理(可通过 setAttribute 设置)
-
MySQLi:主要使用错误代码和函数
-
预处理语句示例比较
PDO 示例
// 连接
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
// 预处理语句 - 命名参数
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id AND status = :status");
$stmt->execute([':id' => $id, ':status' => $status]);
// 预处理语句 - 位置参数
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ? AND status = ?");
$stmt->execute([$id, $status]);
MySQLi 示例
// 连接
$mysqli = new mysqli('localhost', 'user', 'pass', 'test');
// 预处理语句 - 只有位置参数
$stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ? AND status = ?");
$stmt->bind_param("is", $id, $status); // i=integer, s=string
$stmt->execute();
选择建议
-
使用 PDO 如果:
-
需要支持多种数据库
-
想要命名参数的便利性
-
偏好异常处理方式
-
-
使用 MySQLi 如果:
-
只使用 MySQL
-
需要 MySQL 特有的功能(如异步查询)
-
已经在使用 MySQL 扩展并希望平滑迁移
-
两者在性能上差异不大,选择主要取决于项目需求和个人偏好。