closeCursor()

1. 定义

该方法关闭正在移动的游标,使得语句能够被再次执行。 成功时返回 TRUE,失败则返回 FALSE。

注:

  • 某些数据库驱动在上一个执行的PDOStatement对象含有未取行时,无法进行下一个语句的执行(MySQL 不属于此列),该方法就是针对此种情况使用

2. 语法

PDOStatement::closeCursor ( void ) : bool

3. 参数说明

该方法不传入任何参数。

4. 示例

<?php

// PDOStatement::closeCursor()
// 关闭正在移动的游标,使得语句能够被再次执行

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` > :id';
    $stmt = $conn->prepare($sql);
    $stmt->bindValue(':id', 10);
    $stmt->execute();
    $res = $stmt->fetch(PDO::FETCH_ASSOC);// 此时只取了一条结果,游标移动一位,PDOStatement 对象尚有未取行
    var_dump($res);
    /* 输出:
    array(3) {
      ["name"]=>
      string(12) "阿甘正传"
      ["rate"]=>
      string(3) "9.5"
      ["cover"]=>
      string(74) "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2559011361.jpg"
    }
    */

    // 开始执行新的语句(此时游标未到末尾,PDOStatement 对象尚有未取行)
    // 这里使用的数据库驱动为 MySQL,不受游标影响
    $stmt2 = $conn->prepare("SELECT * FROM `movie` WHERE `rate` > 9.5");
    $stmt2->execute();
    $res = $stmt2->fetch(PDO::FETCH_ASSOC);// 此时只取了一条结果,游标移动一位(并未结束)
    var_dump($res);
    /* 输出:
    array(7) {
      ["id"]=>
      string(2) "12"
      ["name"]=>
      string(12) "霸王别姬"
      ["rate"]=>
      string(3) "9.6"
      ["url"]=>
      string(41) "https://movie.douban.com/subject/1291546/"
      ["cover"]=>
      string(74) "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2561716440.jpg"
      ["cover_x"]=>
      string(3) "600"
      ["cover_y"]=>
      string(3) "889"
    }
    */

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

5. 延展阅读