除了功能列表之外,我建议您尝试一下 MySQLi 和 PDO,找出您最喜欢的 API 设计。MySQLi 功能更强大,可能更复杂。PDO 更优雅,并且如果将来您需要使用不同的 DBMS,您只需要学习一个 PHP API 即可。
PHP 提供不同的 API 来连接到 MySQL。下面我们展示了 mysqli 和 PDO 扩展提供的 API。每个代码片段都创建到运行在 "example.com" 上的 MySQL 服务器的连接,使用用户名 "user" 和密码 "password"。并且运行一个查询来问候用户。
示例 #1 比较 MySQL API
<?php
// mysqli
$mysqli = new mysqli("example.com", "user", "password", "database");
$result = $mysqli->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
$row = $result->fetch_assoc();
echo htmlentities($row['_message']);
// PDO
$pdo = new PDO('mysql:host=example.com;dbname=database', 'user', 'password');
$statement = $pdo->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
$row = $statement->fetch(PDO::FETCH_ASSOC);
echo htmlentities($row['_message']);
示例 #2 比较预处理语句
<?php
// mysqli
$mysqli = new mysqli("example.com", "user", "password", "database");
$statement = $mysqli->prepare("SELECT District FROM City WHERE Name=?");
$statement->execute(["Amersfoort"]);
$result = $statement->get_result();
$row = $result->fetch_assoc();
echo htmlentities($row['District']);
// PDO
$pdo = new PDO('mysql:host=example.com;dbname=database', 'user', 'password');
$statement = $pdo->prepare("SELECT District FROM City WHERE Name=?");
$statement->execute(["Amersfoort"]);
$row = $statement->fetch(PDO::FETCH_ASSOC);
echo htmlentities($row['District']);
功能比较
这两个扩展的总体性能被认为大致相同。尽管扩展的性能只占 PHP Web 请求总运行时间的极小部分。通常,影响低至 0.1%。
ext/mysqli | PDO_MySQL | |
---|---|---|
引入的 PHP 版本 | 5.0 | 5.1 |
包含在 PHP 7.x 和 8.x 中 | 是 | 是 |
开发状态 | 活跃 | 活跃 |
生命周期 | 活跃 | 活跃 |
推荐用于新项目 | 是 | 是 |
OOP 接口 | 是 | 是 |
过程式接口 | 是 | 否 |
API 支持使用 mysqlnd 的非阻塞、异步查询 | 是 | 否 |
持久连接 | 是 | 是 |
API 支持字符集 | 是 | 是 |
API 支持服务器端预处理语句 | 是 | 是 |
API 支持客户端端预处理语句 | 否 | 是 |
API 支持存储过程 | 是 | 是 |
API 支持多语句 | 是 | 大多数 |
API 支持事务 | 是 | 是 |
可以使用 SQL 控制事务 | 是 | 是 |
支持所有 MySQL 5.1+ 功能 | 是 | 大多数 |
除了功能列表之外,我建议您尝试一下 MySQLi 和 PDO,找出您最喜欢的 API 设计。MySQLi 功能更强大,可能更复杂。PDO 更优雅,并且如果将来您需要使用不同的 DBMS,您只需要学习一个 PHP API 即可。