PDOStatement::closeCursor
(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.9.0)
PDOStatement::closeCursor —
Закрывает курсор, переводя запрос в состояние готовности к повторному запуску
Описание
public PDOStatement::closeCursor():
bool
Этот метод полезен при использовании драйверов баз данных, которые не
позволяют запустить PDOStatement, пока предыдущий объект PDOStatement не выберет
все данные из результирующего набора. Если это ограничение распространяется
на ваш драйвер, будет вызвана ошибка нарушения последовательности запросов
(out-of-sequence error).
PDOStatement::closeCursor() может быть реализован как
дополнительный метод конкретного драйвера (позволяющий добиться максимальной
эффективности работы), либо как внутренний метод PDO, если такой функции в
драйвере нет. Реализация внутреннего метода PDO семантически схожа с приведённой
ниже:
<?php
do {
while ($stmt->fetch())
;
if (!$stmt->nextRowset())
break;
} while (true);
?>
Список параметров
У этой функции нет параметров.
Возвращаемые значения
Возвращает true
в случае успешного выполнения или false
в случае возникновения ошибки.
Ошибки
Выдаёт ошибку уровня E_WARNING
, если атрибуту PDO::ATTR_ERRMODE
установлено значение PDO::ERRMODE_WARNING
.
Выбрасывает исключение PDOException, если атрибуту PDO::ATTR_ERRMODE
установлено значение PDO::ERRMODE_EXCEPTION
.
Примеры
Пример #1
Пример использования PDOStatement::closeCursor()
В приведённом примере, объект PDOStatement $stmt
возвращает несколько строк, однако приложение считывает только первую из них,
оставляя объект PDOStatement в состоянии, когда есть ещё невыбранные строки.
Чтобы быть уверенным в том, что приложение будет работать со всеми драйверами
баз данных, автор добавил вызов метода
PDOStatement::closeCursor() объекта
$stmt перед тем как запустить другой запрос
PDOStatement $otherStmt.
<?php
/* Создание объекта PDOStatement */
$stmt = $dbh->prepare('SELECT foo FROM bar');
/* Создание другого объекта PDOStatement */
$otherStmt = $dbh->prepare('SELECT foobaz FROM foobar');
/* Выполнение первого запроса */
$stmt->execute();
/* Выборка только первой строки результирующего набора первого запроса */
$stmt->fetch();
/* Следующий вызов closeCursor() может быть обязательным для некоторых драйверов */
$stmt->closeCursor();
/* теперь можно запускать второй запрос */
$otherStmt->execute();
?>