文章目录

PHP 数据库连接:MySQLi 与 PDO

发布于 2026-04-12 21:13:25 · 浏览 24 次 · 评论 0 条

PHP 数据库连接:MySQLi 与 PDO

在 PHP 开发中,连接 MySQL 数据库主要有两种方式:MySQLiPDO。选择哪一种取决于你的项目需求。以下指南将通过具体步骤,演示如何使用这两种方式建立安全、高效的数据库连接,并提供选择建议。


第一步:明确选择方向

在编写代码前,请根据以下逻辑确定使用哪种扩展。这能避免后期重构代码的麻烦。

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: 需手动设置]

根据上图,通常推荐使用 PDO,因为它支持多种数据库且安全性配置更简便。


第二步:使用 PDO 连接数据库

PDO (PHP Data Objects) 提供了一个数据访问抽象层,这意味着无论使用什么数据库,都可以使用相同的函数名。

  1. 准备数据库连接参数。
    你需要数据库的地址(通常为 localhost)、数据库名、用户名和密码。

  2. 创建一个 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) {
        // 捕获连接异常
    }
  3. 设置错误处理模式为抛出异常。
    默认情况下 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 开发的标准。

  1. 实例化 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 预处理

  1. 准备 SQL 语句。
    将变量部分使用占位符(如 :username)代替。

    $sql = "SELECT id, email FROM users WHERE username = :username";
        $stmt = $pdo->prepare($sql);
  2. 执行语句并传入参数。

    $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)
事务支持 支持 支持

根据你的项目需求选择对应的代码块复制并修改配置即可完成连接。

评论 (0)

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

扫一扫,手机查看

扫描上方二维码,在手机上查看本文