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 或响应层结构时显得尤为方便。
字段名一致性:对象方式返回的属性名依赖于数据库字段名,因此字段命名规范非常重要,建议使用英文小写并以下划线分隔。
性能考量:fetchAll() 会一次性加载所有数据,适用于结果集不大的情况。如果数据量庞大,建议使用 fetch() 配合循环按行处理。
扩展模型类时的局限:虽然使用 FETCH_OBJ 返回的是对象,但它是一个 stdClass 实例,若要返回自定义类对象,可使用 PDO::FETCH_CLASS。