fetch()

1. 定义

该方法从PDOStatement结果集中获取下一行。 返回行的形式由传入的参数决定。

一旦失败,返回 FALSE。

注:

  • MySQL 数据库驱动SQLite 数据库驱动并不支持可滚动游标。

2. 语法

PDOStatement::fetch ([ int $fetch_style [, int $cursor_orientation = PDO::FETCH_ORI_NEXT [, int $cursor_offset = 0 ]]] ) : mixed

3. 参数说明

参数 可选性 数据类型 描述
$fetch_style 可选 整型或常量 PDO::FETCH_*系列的常量之一,默认为PDO::FETCH_BOTH
$cursor_orientation 可选 整型或常量 决定可滚动游标的哪一行被返回,PDO::FETCH_ORI_*系列常量之一,默认为PDO::FETCH_ORI_NEXT(返回下一行)
$cursor_offset 可选 整型 获取行号或游标偏移位置

其中,$fetch_style的值有以下可选项:

  • PDO::FETCH_ASSOC:结果集返回一个索引为列名的关联数组
  • PDO::FETCH_BOTH:默认值。结果集分别返回以索引为列名和从零开始的数字的关联数组
  • PDO::FETCH_BOUND:返回TRUE,并将结果集中的列值分配给使用PDOStatement::bindColumn()方法绑定到的 PHP 变量
  • PDO::FETCH_CLASS:返回所请求类的新实例,并将结果集的列值映射到该类中的命名属性。如果$fetch_style包含PDO::FETCH_CLASSTYPE,则类名由第一列的值决定
  • PDO::FETCH_INTO:更新请求的类中已存在的实例,并将结果集的列值映射到该类中的命名属性
  • PDO::FETCH_LAZY:相当于PDO::FETCH_BOTH | PDO::FETCH_OBJ,创建用来访问的对象变量名
  • PDO::FETCH_NUM:结果集返回一个数字索引的数组
  • PDO::FETCH_OBJ:结果集返回一个以列名为属性名的匿名对象

另外,PDO::FETCH_ORI_*系列常量有以下可选值:

  • PDO::FETCH_ORI_NEXT:在结果集中获取下一行。仅对可滚动游标有效。
  • PDO::FETCH_ORI_PRIOR:在结果集中获取上一行。仅对可滚动游标有效。
  • PDO::FETCH_ORI_FIRST:在结果集中获取第一行。仅对可滚动游标有效。
  • PDO::FETCH_ORI_LAST:在结果集中获取最后一行。仅对可滚动游标有效。
  • PDO::FETCH_ORI_ABS:根据行号从结果集中获取需要的行。仅对可滚动游标有效。
  • PDO::FETCH_ORI_REL:根据当前游标位置的相对位置从结果集中获取需要的行。仅对可滚动游标有效。

最后,如果要使用可移动游标,则必须在PDOStatement::prepare()预处理 SQL 语句时,设置PDO::ATTR_CURSOR属性值为PDO::CURSOR_SCROLL$cursor_offsetcursor_orientation参数被设置为PDO::FETCH_ORI_ABS(根据行号获取需要的行)时,该参数应该为“需要获取的行号值”;而cursor_orientation参数被设置为PDO::FETCH_ORI_REL(根据游标位置的相对位置获取需要的行)时,该参数为游标的偏移数。

4. 示例

<?php

// PDOStatement::fetch()
// 从`PDOStatement`结果集中获取下一行

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 `name`,`rate`,`cover` FROM `movie` WHERE `id` > 0 ORDER BY `id`';
    $stmt = $conn->prepare($sql);
    $stmt->execute();

    $res = $stmt->fetch(PDO::FETCH_ASSOC);
    var_dump($res);
    /* 输出:
    array(3) {
      ["name"]=>
      string(21) "哪吒之魔童降世"
      ["rate"]=>
      string(3) "8.5"
      ["cover"]=>
      string(74) "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2563780504.jpg"
    }
    */

    $res = $stmt->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_NEXT);// 获取下一行数据的关联数组
    var_dump($res);
    /* 输出:
    array(3) {
      ["name"]=>
      string(15) "我不是药神"
      ["rate"]=>
      string(3) "9.0"
      ["cover"]=>
      string(74) "https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2561305376.jpg"
    }
    */

    $res = $stmt->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_PRIOR);// 获取上一行数据的关联数组
    var_dump($res);// 但结果还是下一行的数据,因为还没有设置可滚动游标
    /* 输出:
    array(3) {
      ["name"]=>
      string(33) "续命之徒:绝命毒师电影"
      ["rate"]=>
      string(3) "8.3"
      ["cover"]=>
      string(74) "https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2569548689.jpg"
    }
    */

    // 开始设置可滚动游标:注意,这里是MySQL驱动,并不支持可滚动游标,因此以下代码得不到期望的结果
    $stmt = $conn->prepare($sql, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
    $stmt->execute();
    $res = $stmt->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_ABS, 3);// 获取指定行数据的关联数组
    var_dump($res);
    /* 输出:
    array(3) {
      ["name"]=>
      string(21) "哪吒之魔童降世"
      ["rate"]=>
      string(3) "8.5"
      ["cover"]=>
      string(74) "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2563780504.jpg"
    }
    */

} catch (Exception $e) {
    echo "发生了错误:", $e->getMessage();
}

5. 延展阅读