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 函数。