ZetCode

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

此示例演示如何将行作为关联数组获取。

fetch_assoc.php
<?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 对象获取。

fetch_obj.php
<?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

这演示了如何将行获取到特定类的实例中。

fetch_class.php
<?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

这展示了如何将行获取到现有的对象实例中。

fetch_into.php
<?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

这演示了如何从结果集中获取单个列。

fetch_column.php
<?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

这展示了如何将行作为键值对获取。

fetch_key_pair.php
<?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

这演示了如何按列值对行进行分组。

fetch_group.php
<?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 结合使用时,它会创建一个嵌套数组结构。这对于分层数据很有用。

最佳实践

来源

PHP PDOStatement::setFetchMode 文档

本教程涵盖了 PDOStatement::setFetchMode 方法,并通过实际示例展示了在 PHP 中获取数据库结果的各种方法。

作者

我叫 Jan Bodnar,是一名热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出 所有 PHP PDO 函数