nextRowset()

1. 定义

该方法在一个具有多个PDOStatement结果集的数据库句柄中,向下推进至下一个结果集。 成功时返回 TRUE,失败则返回 FALSE。

注:

  • 该方法仅对支持“存储过程”方法的数据库驱动有效
  • 每个结果集可以有不同的列

2. 语法

PDOStatement::nextRowset ( void ) : bool

3. 参数说明

该方法不传入任何参数。

4. 示例

首先,我们先在数据库定义一个存储过程(如已定义,发生重复定义错误时可略过):

-- 临时修改语句分隔符为双斜线
DELIMITER //

-- 创建存储过程:这里将返回三个结果集
CREATE PROCEDURE movie_query(IN low INT, IN high INT)
BEGIN
    SELECT `name`,`url` FROM `movie` WHERE `rate` > high;
    -- SELECT * FROM `movie` WHERE `rate` < high AND `rate` > low;-- 查询评分大于 low 且小于 high 的记录
    -- SELECT `name`,`rate` FROM `movie` WHERE `id` > 12;
END //

-- 改回语句分隔符为分号
DELIMITER ;

以上代码可通过 MySQL 的终端执行。

调用存储过程代码如下:

<?php

// PDOStatement::nextRowset()
// 在一个具有多个`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 {
    // 执行存储过程
    $stmt = $conn->prepare('CALL movie_query(7, 9)');
    $stmt->execute();
    // $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    // var_dump($result);

    // 获取结果
    do {
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
        if (!empty($result)) var_dump($result);
    } while ($stmt->nextRowset());
} catch (Exception $e) {
    echo "发生了错误:", $e->getMessage();
}
/* 
array(9) {
  [0]=>
  array(2) {
    ["name"]=>
    string(15) "疯狂动物城"
    ["url"]=>
    string(42) "https://movie.douban.com/subject/25662329/"
  }
  [1]=>
  array(2) {
    ["name"]=>
    string(21) "三傻大闹宝莱坞"
    ["url"]=>
    string(41) "https://movie.douban.com/subject/3793023/"
  }
  ...
  [7]=>
  array(2) {
    ["name"]=>
    string(12) "霸王别姬"
    ["url"]=>
    string(41) "https://movie.douban.com/subject/1291546/"
  }
  [8]=>
  array(2) {
    ["name"]=>
    string(18) "肖申克的救赎"
    ["url"]=>
    string(41) "https://movie.douban.com/subject/1292052/"
  }
}
*/

5. 延展阅读