PHP PDOStatement::fetchAll 方法
最后修改于 2025 年 4 月 19 日
PDOStatement::fetchAll 方法将结果集中的所有行检索为一个数组。它是一个强大的方法,在如何从数据库查询中返回数据方面提供了灵活性。
基本定义
PDOStatement::fetchAll 返回一个包含结果集中所有剩余行的数组。该数组将每一行表示为一个数组或对象。
语法:PDOStatement::fetchAll(int $mode = PDO::FETCH_DEFAULT, mixed ...$args): array
。mode 参数决定了行的返回方式。
fetchAll 的基本用法
这演示了 fetchAll 获取所有行作为数组的最简单用法。
<?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 将所有行作为关联数组获取。
<?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 对象获取。
<?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 从所有行中只获取一列。
<?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 索引)。
获取到特定类
这演示了如何将行直接获取到自定义类的实例中。
<?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 按列对结果进行分组。
<?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 从两列创建键值对。
<?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 创建一个关联数组,其中第一列成为键,第二列成为值。查询必须只选择两列。
最佳实践
- 内存使用:对大型结果集要谨慎。
- 获取模式:选择最适合您需求的一种。
- 列选择:只选择需要的列。
- 错误处理:始终在 PDO 中使用 try-catch。
- 预处理语句:与 fetchAll 一起使用以确保安全。
来源
本教程涵盖了 PDOStatement::fetchAll 方法,并通过实际示例展示了不同的获取模式及其在数据库操作中的应用。
作者
列出 所有 PHP PDO 函数。