PHP PDOStatement::setFetchMode 教程
最后修改于 2025 年 4 月 19 日
PDOStatement::setFetchMode 方法控制 PDO 如何从数据库查询中返回行。它决定了获取数据的格式。
基本定义
PDOStatement::setFetchMode 为语句对象设置获取模式。它会影响调用 fetch() 或 fetchAll() 时行的返回方式。
语法:public PDOStatement::setFetchMode(int $mode, mixed ...$args): bool。 mode 参数指定获取样式。可选的 args 为某些模式提供附加参数。
FETCH_ASSOC
此示例演示如何将行作为关联数组获取。
<?php
declare(strict_types=1);
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$stmt = $pdo->query('SELECT id, name, email FROM users');
$stmt->setFetchMode(PDO::FETCH_ASSOC);
while ($row = $stmt->fetch()) {
echo "ID: {$row['id']}, Name: {$row['name']}, Email: {$row['email']}\n";
}
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
FETCH_ASSOC 将每一行作为由列名索引的数组返回。当您需要按数据库名称访问列时,这很有用。
FETCH_OBJ
这展示了如何将行作为 stdClass 对象获取。
<?php
declare(strict_types=1);
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$stmt = $pdo->query('SELECT id, name FROM users');
$stmt->setFetchMode(PDO::FETCH_OBJ);
while ($user = $stmt->fetch()) {
echo "ID: {$user->id}, Name: {$user->name}\n";
}
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
FETCH_OBJ 将每一行作为 stdClass 对象返回。属性对应列名。这提供了对结果数据的面向对象访问。
FETCH_CLASS
这演示了如何将行获取到特定类的实例中。
<?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');
$stmt = $pdo->query('SELECT id, name, email FROM users');
$stmt->setFetchMode(PDO::FETCH_CLASS, 'User');
while ($user = $stmt->fetch()) {
echo "User: {$user->name} ({$user->email})\n";
}
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
FETCH_CLASS 创建指定类的实例。列值被分配给匹配的属性。类必须在使用前定义。
FETCH_INTO
这展示了如何将行获取到现有的对象实例中。
<?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');
$stmt = $pdo->query('SELECT id, name, email FROM users');
$user = new User();
$stmt->setFetchMode(PDO::FETCH_INTO, $user);
while ($stmt->fetch()) {
echo "User: {$user->name} ({$user->email})\n";
}
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
FETCH_INTO 使用每一行的fecth数据更新现有对象。每次fecth使用相同的对象。这可能比创建新对象更有效。
FETCH_COLUMN
这演示了如何从结果集中获取单个列。
<?php
declare(strict_types=1);
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$stmt = $pdo->query('SELECT name FROM users');
$stmt->setFetchMode(PDO::FETCH_COLUMN, 0);
while ($name = $stmt->fetch()) {
echo "Name: $name\n";
}
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
FETCH_COLUMN 返回单个列的值。第二个参数指定列索引(从0开始)。这对于简单列表很有用。
FETCH_KEY_PAIR
这展示了如何将行作为键值对获取。
<?php
declare(strict_types=1);
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$stmt = $pdo->query('SELECT id, name FROM users');
$stmt->setFetchMode(PDO::FETCH_KEY_PAIR);
$users = $stmt->fetchAll();
foreach ($users as $id => $name) {
echo "ID $id: $name\n";
}
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
FETCH_KEY_PAIR 将行作为键值对返回。第一列作为键,第二列作为值。这对于创建查找数组很有用。
FETCH_GROUP
这演示了如何按列值对行进行分组。
<?php
declare(strict_types=1);
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$stmt = $pdo->query('SELECT role, name, email FROM users ORDER BY role');
$stmt->setFetchMode(PDO::FETCH_GROUP|PDO::FETCH_ASSOC);
$groupedUsers = $stmt->fetchAll();
foreach ($groupedUsers as $role => $users) {
echo "Role: $role\n";
foreach ($users as $user) {
echo " - {$user['name']} ({$user['email']})\n";
}
}
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
FETCH_GROUP 按第一列的值对行进行分组。与 FETCH_ASSOC 结合使用时,它会创建一个嵌套数组结构。这对于分层数据很有用。
最佳实践
- 选择合适的模式:根据数据需求匹配获取模式。
- 一致性:在整个应用程序中使用相同的模式。
- 性能:对于单个列数据,请使用 FETCH_COLUMN。
- 类型安全:使用带有类型化属性的
FETCH_CLASS。 - 内存:对于大型结果集,请使用
fetch。
来源
PHP PDOStatement::setFetchMode 文档
本教程涵盖了 PDOStatement::setFetchMode 方法,并通过实际示例展示了在 PHP 中获取数据库结果的各种方法。
作者
列出 所有 PHP PDO 函数。