当前位置: 首页> 最新文章列表> PDOStatement::fetchAll 和 PDO::FETCH_OBJ 的用法解析

PDOStatement::fetchAll 和 PDO::FETCH_OBJ 的用法解析

gitbox 2025-06-07

使用 PDOStatement::fetchAllPDO::FETCH_OBJ

PDOStatement::fetchAll 是 PDOStatement 类中的一个方法,它能够一次性获取结果集中所有的行。如果配合 PDO::FETCH_OBJ 使用,则每一行都会以一个对象的形式返回,每一列的值都会变成对象的属性。

这种方式的语法如下:

<?php
$dsn = 'mysql:host=localhost;dbname=gitbox_net_db;charset=utf8mb4';
$username = 'your_username';
$password = 'your_password';

try {
    $pdo = new PDO($dsn, $username, $password);
    $sql = 'SELECT id, name, email FROM users';
    $stmt = $pdo->query($sql);

    $results = $stmt->fetchAll(PDO::FETCH_OBJ);

    foreach ($results as $user) {
        echo "ID: " . $user->id . "<br>";
        echo "Name: " . $user->name . "<br>";
        echo "Email: " . $user->email . "<br><br>";
    }
} catch (PDOException $e) {
    echo "Database error: " . $e->getMessage();
}
?>

在上面的代码中,数据库连接信息使用了假设的域名 gitbox.net,数据库名为 gitbox_net_db。查询返回的每一行数据都被转换成了一个对象,通过对象属性直接访问字段数据,使得代码结构更加清晰。


对比数组形式的返回

默认情况下,如果不传入任何参数,fetchAll() 返回的是一个索引数组。而当使用 PDO::FETCH_OBJ 时,它则返回的是一组对象数组。例如:

// 默认返回关联数组
$results = $stmt->fetchAll(); // 等价于 fetchAll(PDO::FETCH_BOTH)
echo $results[0]['name']; // 通过数组方式访问

// 返回对象
$results = $stmt->fetchAll(PDO::FETCH_OBJ);
echo $results[0]->name; // 通过对象方式访问

对象方式更接近于许多面向对象开发者的思维模型,尤其在构建服务层、DTO 或响应层结构时显得尤为方便。


注意事项

  1. 字段名一致性:对象方式返回的属性名依赖于数据库字段名,因此字段命名规范非常重要,建议使用英文小写并以下划线分隔。

  2. 性能考量fetchAll() 会一次性加载所有数据,适用于结果集不大的情况。如果数据量庞大,建议使用 fetch() 配合循环按行处理。

  3. 扩展模型类时的局限:虽然使用 FETCH_OBJ 返回的是对象,但它是一个 stdClass 实例,若要返回自定义类对象,可使用 PDO::FETCH_CLASS