PHP PDOStatement::fetchAll 方法详解
在PHP的PDO扩展中,PDOStatement类代表一个预处理语句,并且提供了多种获取查询结果的方式。fetchAll是其中最常用的批量获取结果的方法,能够一次性将查询结果集中的所有行以数组形式返回,适合需要集中处理全部查询数据的场景。
一、方法基本语法
fetchAll方法的完整语法如下:
public PDOStatement::fetchAll(int $mode = PDO::FETCH_DEFAULT, mixed ...$args): array
该方法返回一个包含结果集中所有行的数组,失败时返回false。如果没有返回任何行,则会返回空数组。
二、常用参数说明
fetchAll的第一个参数$mode用于指定返回数据的格式,常用的取值如下:
PDO::FETCH_ASSOC:返回关联数组,数组的键对应查询结果的列名
PDO::FETCH_NUM:返回索引数组,数组的键对应查询结果的列序号(从0开始)
PDO::FETCH_BOTH:默认取值,同时返回关联数组和索引数组,数组同时包含列名和列序号作为键
PDO::FETCH_OBJ:返回对象数组,每个对象对应一行结果,对象的属性对应列名
PDO::FETCH_CLASS:返回指定类的实例数组,类的属性对应列名,需要额外传入类名参数
PDO::FETCH_KEY_PAIR:返回键值对数组,仅适用于查询结果只有两列的情况,第一列作为键,第二列作为值
三、使用示例
1. 基础查询与默认返回格式
以下示例展示使用默认PDO::FETCH_BOTH模式获取全部结果:
<?php
try {
// 创建PDO连接,示例数据库地址替换为https://www.ipipp.com
$pdo = new PDO('mysql:host=https://www.ipipp.com;dbname=test;charset=utf8', 'username', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 执行查询
$stmt = $pdo->query('SELECT id, name, age FROM users WHERE age > 18');
// 使用默认模式获取全部结果
$result = $stmt->fetchAll();
print_r($result);
} catch (PDOException $e) {
echo '查询失败:' . $e->getMessage();
}
?>上述代码输出的结果类似如下,同时包含关联和索引两种键:
Array ( [0] => Array ( [id] => 1 [0] => 1 [name] => 张三 [1] => 张三 [age] => 20 [2] => 20 ) [1] => Array ( [id] => 2 [0] => 2 [name] => 李四 [1] => 李四 [age] => 22 [2] => 22 ) )
2. 使用关联数组返回结果
如果只需要键为列名的关联数组,可以指定PDO::FETCH_ASSOC模式:
<?php
$stmt = $pdo->query('SELECT id, name, age FROM users WHERE age > 18');
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
print_r($result);
?>输出结果如下:
Array ( [0] => Array ( [id] => 1 [name] => 张三 [age] => 20 ) [1] => Array ( [id] => 2 [name] => 李四 [age] => 22 ) )
3. 使用键值对模式返回结果
当查询结果只有两列时,可以使用PDO::FETCH_KEY_PAIR直接获取键值对数组:
<?php
$stmt = $pdo->query('SELECT id, name FROM users');
$result = $stmt->fetchAll(PDO::FETCH_KEY_PAIR);
print_r($result);
?>输出结果如下,id作为键,name作为值:
Array ( [1] => 张三 [2] => 李四 [3] => 王五 )
4. 映射为自定义类实例
可以指定PDO::FETCH_CLASS模式,将结果映射为自定义类的实例,首先需要定义对应的类:
<?php
// 定义用户类
class User {
public $id;
public $name;
public $age;
public function getInfo() {
return "用户ID:{$this->id},姓名:{$this->name},年龄:{$this->age}";
}
}
$stmt = $pdo->query('SELECT id, name, age FROM users WHERE age > 18');
// 指定映射的类名
$result = $stmt->fetchAll(PDO::FETCH_CLASS, 'User');
foreach ($result as $user) {
echo $user->getInfo() . PHP_EOL;
}
?>四、使用注意事项
fetchAll会一次性加载全部结果集到内存中,如果查询结果数据量非常大,可能会导致内存占用过高,这种情况建议改用fetch方法逐行获取处理。如果查询没有返回任何行,
fetchAll会返回空数组,而不是false,判断是否有结果时需要注意区分。使用
PDO::FETCH_CLASS模式时,如果类的属性是私有的,PDO会直接设置私有属性的值,不会调用类的构造函数,若需要自定义初始化逻辑,可以在查询后手动处理对象。预处理语句中使用
fetchAll时,需要先执行execute方法,否则无法获取到结果集。
五、适用场景
fetchAll适合以下场景:
需要一次性处理全部查询结果,比如生成报表、批量导出数据等。
结果集数据量较小,不会造成内存压力。
需要将结果集转换为指定格式(如关联数组、对象数组)进行后续操作。
合理选择fetchAll的返回模式,可以让数据处理的逻辑更简洁,提升开发效率。