setFetchMode()

1. 定义

该方法为 PDO 语句设置默认的获取结果集模式。 成功时返回 TRUE,失败则返回 FALSE。

2. 语法

PDOStatement::setFetchMode ( int $mode ) : bool

PDOStatement::setFetchMode ( int $PDO::FETCH_COLUMN , int $colno ) : bool

PDOStatement::setFetchMode ( int $PDO::FETCH_CLASS , string $classname , array $ctorargs ) : bool

PDOStatement::setFetchMode ( int $PDO::FETCH_INTO , object $object ) : bool

3. 参数说明

参数 可选性 数据类型 描述
$mode 必需 整型或常量 PDO::FETCH_*系列的常量之一
$colno 必需 整型 列号,在使用PDO::FETCH_COLUMN常量时必需
$classname 必需 字符串 类名,在使用PDO::FETCH_CLASS常量时必需
$ctorargs 必需 数组 类构造函数参数,在使用PDO::FETCH_CLASS常量时必需
$object 必需 object 类对象,在使用PDO::FETCH_INTO常量时必需

其中,$mode有以下几种获取结果集的方式,其中三种(PDO::FETCH_COLUMNPDO::FETCH_CLASSPDO::FETCH_INTO)需要额外传入参数(如参数表所示):

  • PDO::FETCH_ASSOC:结果集返回一个索引为列名的关联数组
  • PDO::FETCH_BOTH:默认值。结果集分别返回以索引为列名和从零开始的数字的关联数组
  • PDO::FETCH_BOUND:返回TRUE,并将结果集中的列值分配给使用PDOStatement::bindColumn()方法绑定到的 PHP 变量
  • PDO::FETCH_CLASS:返回所请求类的新实例,并将结果集的列值映射到该类中的命名属性,当与PDO::FETCH_PROPS_LATE同时使用时,将调用该类的构造函数
  • PDO::FETCH_INTO:更新请求的类中已存在的实例,并将结果集的列值映射到该类中的命名属性
  • PDO::FETCH_NUM:结果集返回一个数字索引的数组
  • PDO::FETCH_OBJ:结果集返回一个以列名为属性名的匿名对象
  • PDO::FETCH_PROPS_LATE:当与PDO::FETCH_CLASS同时使用时,将在从各个列值分配属性之前调用该类的构造函数

4. 示例

<?php

// PDOStatement::setFetchMode()
// 为 PDO 语句设置默认的获取结果集模式

class Movie
{
    public $name = '';
    public $rate = 9.0;

    public function __construct($name = '电影名称', $rate)
    {
        $this->name = $name;
        $this->rate = $rate;
    }
    public function getName()
    {
        return $this->name;
    }
}

try {
    $config = ['driver' => 'mysql', 'host' => 'localhost', 'dbname' => 'test', 'charset' => 'utf8', 'user' => 'root', 'pwd' => 'mysql'];
    $dsn = sprintf('%s:host=%s;dbname=%s;charset=%s', $config['driver'], $config['host'], $config['dbname'], $config['charset']);
    $conn = new PDO($dsn, $config['user'], $config['pwd']);
} catch (PDOException $e) {
    error_log($e->getMessage());
    echo $e->getMessage();
}

try {
    $sql = 'SELECT `rate`,`name` FROM `movie` ORDER BY `id` LIMIT 2';
    $stmt = $conn->prepare($sql);
    $stmt->setFetchMode(PDO::FETCH_ASSOC);// 结果集为 以列名为索引的关联数组
    $stmt->execute();
    var_dump($stmt->fetchAll());
    /* 输出:
    array(2) {
      [0]=>
      array(2) {
        ["rate"]=>
        string(3) "9.4"
        ["name"]=>
        string(15) "泰坦尼克号"
      }
      [1]=>
      array(2) {
        ["rate"]=>
        string(3) "9.5"
        ["name"]=>
        string(12) "阿甘正传"
      }
    }
    */
    $stmt->setFetchMode(PDO::FETCH_BOTH);// 结果集为 以列名为索引的关联数组和以数字为索引的数组,这也是默认获取结果集的方式
    $stmt->execute();
    var_dump($stmt->fetchAll());
    /* 输出:
    array(2) {
      [0]=>
      array(4) {
        ["rate"]=>
        string(3) "9.4"
        [0]=>
        string(3) "9.4"
        ["name"]=>
        string(15) "泰坦尼克号"
        [1]=>
        string(15) "泰坦尼克号"
      }
      [1]=>
      array(4) {
        ["rate"]=>
        string(3) "9.5"
        [0]=>
        string(3) "9.5"
        ["name"]=>
        string(12) "阿甘正传"
        [1]=>
        string(12) "阿甘正传"
      }
    }
    */
    $stmt->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'Movie', ['name','rate']);// 结果集为 指定类的新实例数组,配合 PDO::FETCH_PROPS_LATE 同时使用时,将调用指定类的构造函数
    $stmt->execute();
    $res = $stmt->fetchAll();
    var_dump($res);
    /* 输出:
    array(2) {
      [0]=>
      object(Movie)#3 (2) {
        ["name"]=>
        string(15) "泰坦尼克号"
        ["rate"]=>
        string(3) "9.4"
      }
      [1]=>
      object(Movie)#4 (2) {
        ["name"]=>
        string(12) "阿甘正传"
        ["rate"]=>
        string(3) "9.5"
      }
    }
    */
    var_dump($res[0]->getName());// 输出:string(15) "泰坦尼克号"
    $stmt->setFetchMode(PDO::FETCH_OBJ);// 结果集为 以列名为属性名的匿名对象(stdClass)数组
    $stmt->execute();
    var_dump($stmt->fetchAll());
    /* 输出:
    array(2) {
      [0]=>
      object(stdClass)#5 (2) {
        ["rate"]=>
        string(3) "9.4"
        ["name"]=>
        string(15) "泰坦尼克号"
      }
      [1]=>
      object(stdClass)#6 (2) {
        ["rate"]=>
        string(3) "9.5"
        ["name"]=>
        string(12) "阿甘正传"
      }
    }
    */
} catch (Exception $e) {
    echo "发生了错误:", $e->getMessage();
}