ZetCode

PHP PDOStatement::fetchAll 方法

最后修改于 2025 年 4 月 19 日

PDOStatement::fetchAll 方法将结果集中的所有行检索为一个数组。它是一个强大的方法,在如何从数据库查询中返回数据方面提供了灵活性。

基本定义

PDOStatement::fetchAll 返回一个包含结果集中所有剩余行的数组。该数组将每一行表示为一个数组或对象。

语法:PDOStatement::fetchAll(int $mode = PDO::FETCH_DEFAULT, mixed ...$args): array。mode 参数决定了行的返回方式。

fetchAll 的基本用法

这演示了 fetchAll 获取所有行作为数组的最简单用法。

fetchall_basic.php
<?php

declare(strict_types=1);

try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $stmt = $pdo->query('SELECT id, name FROM users');
    $results = $stmt->fetchAll();
    
    foreach ($results as $row) {
        echo "ID: {$row['id']}, Name: {$row['name']}\n";
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

此示例从 users 表中获取所有行。默认情况下,fetchAll 返回一个数组的数组,其中每个内部数组代表一行。默认的获取模式是 PDO::FETCH_BOTH。

作为关联数组获取

这显示了如何使用 FETCH_ASSOC 将所有行作为关联数组获取。

fetchall_assoc.php
<?php

declare(strict_types=1);

try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $stmt = $pdo->query('SELECT id, name, email FROM users');
    $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    print_r($results);
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

使用 PDO::FETCH_ASSOC 只返回关联数组,不带数字索引。当您只需要命名列时,这比 FETCH_BOTH 更节省内存。

作为对象获取

这演示了如何使用 FETCH_OBJ 将所有行作为 stdClass 对象获取。

fetchall_obj.php
<?php

declare(strict_types=1);

try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $stmt = $pdo->query('SELECT id, name FROM users');
    $results = $stmt->fetchAll(PDO::FETCH_OBJ);
    
    foreach ($results as $user) {
        echo "ID: {$user->id}, Name: {$user->name}\n";
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

FETCH_OBJ 将每一行作为 stdClass 对象返回,其属性与列名匹配。这提供了对结果数据的面向对象访问。

获取单列

这显示了如何使用 FETCH_COLUMN 从所有行中只获取一列。

fetchall_column.php
<?php

declare(strict_types=1);

try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $stmt = $pdo->query('SELECT name FROM users');
    $names = $stmt->fetchAll(PDO::FETCH_COLUMN, 0);
    
    echo "User names: " . implode(', ', $names);
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

FETCH_COLUMN 返回一个包含单个列值的简单数组。第二个参数(此处为 0)指定要获取的列(0 索引)。

获取到特定类

这演示了如何将行直接获取到自定义类的实例中。

fetchall_class.php
<?php

declare(strict_types=1);

class User {
    public int $id;
    public string $name;
    public string $email;
}

try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $stmt = $pdo->query('SELECT id, name, email FROM users');
    $users = $stmt->fetchAll(PDO::FETCH_CLASS, 'User');
    
    foreach ($users as $user) {
        echo "User: {$user->name} ({$user->email})\n";
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

FETCH_CLASS 创建指定类的实例,设置与列名匹配的属性。必须在使用前定义该类,并且属性必须是公共的。

分组结果

这显示了如何使用 FETCH_GROUP 按列对结果进行分组。

fetchall_group.php
<?php

declare(strict_types=1);

try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $stmt = $pdo->query('SELECT department, name, salary FROM employees');
    $grouped = $stmt->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_ASSOC);
    
    foreach ($grouped as $dept => $employees) {
        echo "Department: $dept\n";
        foreach ($employees as $emp) {
            echo "- {$emp['name']}: {$emp['salary']}\n";
        }
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

FETCH_GROUP 返回按第一列分组的结果。与 FETCH_ASSOC 结合使用时,它会创建一个以分组列为键的多维数组。

键值对

这演示了如何使用 FETCH_KEY_PAIR 从两列创建键值对。

fetchall_keypair.php
<?php

declare(strict_types=1);

try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $stmt = $pdo->query('SELECT id, email FROM users');
    $emailMap = $stmt->fetchAll(PDO::FETCH_KEY_PAIR);
    
    print_r($emailMap);
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

FETCH_KEY_PAIR 创建一个关联数组,其中第一列成为键,第二列成为值。查询必须只选择两列。

最佳实践

来源

PHP fetchAll 文档

本教程涵盖了 PDOStatement::fetchAll 方法,并通过实际示例展示了不同的获取模式及其在数据库操作中的应用。

作者

我叫 Jan Bodnar,是一名充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出 所有 PHP PDO 函数