PHP 数据库连接:MySQLi 与 PDO
在 PHP 开发中,连接 MySQL 数据库主要有两种方式:MySQLi 和 PDO。选择哪一种取决于你的项目需求。以下指南将通过具体步骤,演示如何使用这两种方式建立安全、高效的数据库连接,并提供选择建议。
第一步:明确选择方向
在编写代码前,请根据以下逻辑确定使用哪种扩展。这能避免后期重构代码的麻烦。
graph TD
Start["开始: 选择连接方式"] --> NeedMulti{"是否需要
切换多种数据库?"} NeedMulti -- "是 (Yes)" --> ChoicePDO[推荐使用 PDO] NeedMulti -- "否 (No)" --> StylePref{"代码风格偏好?"} StylePref -- "面向对象 (OOP)" --> ChoicePDO StylePref -- "仅面向过程" --> ChoiceMySQLi[使用 MySQLi] Start2["开始: 安全性要求"] --> SQLInject{"是否使用
预处理语句?"} SQLInject -- "必须 (高安全性)" --> SecurePDO[PDO: 默认支持] SQLInject -- "MySQLi: 需手动开启" --> SecureMySQLi[MySQLi: 需手动设置]
切换多种数据库?"} NeedMulti -- "是 (Yes)" --> ChoicePDO[推荐使用 PDO] NeedMulti -- "否 (No)" --> StylePref{"代码风格偏好?"} StylePref -- "面向对象 (OOP)" --> ChoicePDO StylePref -- "仅面向过程" --> ChoiceMySQLi[使用 MySQLi] Start2["开始: 安全性要求"] --> SQLInject{"是否使用
预处理语句?"} SQLInject -- "必须 (高安全性)" --> SecurePDO[PDO: 默认支持] SQLInject -- "MySQLi: 需手动开启" --> SecureMySQLi[MySQLi: 需手动设置]
根据上图,通常推荐使用 PDO,因为它支持多种数据库且安全性配置更简便。
第二步:使用 PDO 连接数据库
PDO (PHP Data Objects) 提供了一个数据访问抽象层,这意味着无论使用什么数据库,都可以使用相同的函数名。
-
准备数据库连接参数。
你需要数据库的地址(通常为localhost)、数据库名、用户名和密码。 -
创建一个 DSN (Data Source Name) 字符串。
DSN 告诉 PDO 该连接哪种类型的数据库以及在哪里连接。$dsn = "mysql:host=localhost;dbname=test_db;charset=utf8mb4"; ``` 3. **实例化** PDO 对象并建立连接。 将 DSN、用户名和密码传入 `new PDO()` 构造函数。 ```php $username = "root"; $password = "your_password"; try { $pdo = new PDO($dsn, $username, $password); } catch (PDOException $e) { // 捕获连接异常 } -
设置错误处理模式为抛出异常。
默认情况下 PDO 可能只静默报错,修改属性可以让它在出错时抛出PDOException,便于调试。$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); ``` 5. **配置**默认获取方式为关联数组。 这样查询结果返回的数组将以字段名作为键,更直观。 ```php $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
第三步:使用 MySQLi 连接数据库
MySQLi (MySQL Improved) 是专门针对 MySQL 数据库的扩展,提供了面向对象和面向过程两种接口。以下以面向对象风格为例,这是现代 PHP 开发的标准。
-
实例化
mysqli类。
依次传入主机名、用户名、密码和数据库名。$host = "localhost"; $user = "root"; $pass = "your_password"; $dbname = "test_db"; $mysqli = new mysqli($host, $user, $pass, $dbname); ``` 2. **检查**连接错误。 连接后,必须检查 `connect_errno` 属性。如果不为 0,说明连接失败。 ```php if ($mysqli->connect_errno) { die("连接失败: " . $mysqli->connect_error); } ``` 3. **设置**默认字符集。 **避免**出现乱码,通常设置为 `utf8mb4`。 ```php $mysqli->set_charset("utf8mb4");
第四步:安全执行查询(预处理语句)
无论是 PDO 还是 MySQLi,都严禁直接拼接 SQL 字符串。必须使用预处理语句来防止 SQL 注入。
使用 PDO 预处理
-
准备 SQL 语句。
将变量部分使用占位符(如:username)代替。$sql = "SELECT id, email FROM users WHERE username = :username"; $stmt = $pdo->prepare($sql); -
执行语句并传入参数。
$username = "admin"; $stmt->execute(['username' => $username]); ``` 3. **获取**结果。 ```php $user = $stmt->fetch(); ``` #### 使用 MySQLi 预处理 1. **准备** SQL 语句。 使用问号 `?` 作为占位符。 ```php $sql = "SELECT id, email FROM users WHERE username = ?"; $stmt = $mysqli->prepare($sql); ``` 2. **绑定**参数并执行。 `bind_param` 中,第一个字符 `s` 代表参数类型(字符串),后续为变量。 ```php $username = "admin"; $stmt->bind_param("s", $username); $stmt->execute(); ``` 3. **获取**结果。 ```php $result = $stmt->get_result(); $user = $result->fetch_assoc();
第五步:对比与参考
为了快速理解两者的区别,请参考下表。
| 特性 | PDO (PHP Data Objects) | MySQLi (MySQL Improved) |
|---|---|---|
| 数据库支持 | 支持 12+ 种数据库(MySQL, PostgreSQL, SQLite 等) | 仅支持 MySQL |
| API 风格 | 面向对象 | 面向对象 + 面向过程 |
| 命名参数 | 支持 (:name) |
不支持(仅支持 ? 占位符) |
| 性能 | 极快 | 极快(MySQL 专用,略快于 PDO) |
| 事务支持 | 支持 | 支持 |
根据你的项目需求选择对应的代码块复制并修改配置即可完成连接。

暂无评论,快来抢沙发吧!