PDOStatement::closeCursor
(PHP 5 >= 5.1.0, PECL pdo >= 0.9.0)
PDOStatement::closeCursor — Закрывает курсор, переводя запрос в состояние готовности к повторному запуску
Описание
PDOStatement::closeCursor() освобождает соединение с сервером, давая возможность запускать другие SQL запросы. Метод оставляет запрос в состоянии готовности к повторному запуску.
Этот метод полезен при использовании драйверов баз данных, которые не позволяют запустить PDOStatement, пока предыдущий объект PDOStatement не выберет все данные из результирующего набора. Если это ограничение распространяется на ваш драйвер, будет вызвана ошибка нарушиения последовательности запросов (out-of-sequence error).
PDOStatement::closeCursor() может быть реализован как дополнительный метод конкретного драйвера (позволяющий добиться максимальной эффективности работы), либо как внутренний метод PDO, если такой функции в драйвере нет. Реализация внутреннего метода PDO семантически схожа с приведенной ниже:
<?php
do {
while ($stmt->fetch())
;
if (!$stmt->nextRowset())
break;
} while (true);
?>
Возвращаемые значения
Возвращает TRUE
в случае успешного завершения или FALSE
в случае возникновения ошибки.
Примеры
Пример #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();
?>
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Расширения для работы с базами данных
- Уровни абстракции
- Объекты данных PHP
- Функция PDOStatement::bindColumn() - Связывает столбец с PHP переменной
- Функция PDOStatement::bindParam() - Привязывает параметр запроса к переменной
- Функция PDOStatement::bindValue() - Связывает параметр с заданным значением
- Функция PDOStatement::closeCursor() - Закрывает курсор, переводя запрос в состояние готовности к повторному запуску
- Функция PDOStatement::columnCount() - Возвращает количество столбцов в результирующем наборе
- Функция PDOStatement::debugDumpParams() - Вывод информации о подготовленной SQL команде в целях отладки
- Функция PDOStatement::errorCode() - Определяет SQLSTATE код соответствующий последней операции объекта PDOStatement
- PDOStatement::errorInfo
- Функция PDOStatement::execute() - Запускает подготовленный запрос на выполнение
- Функция PDOStatement::fetch() - Извлечение следующей строки из результирующего набора
- Функция PDOStatement::fetchAll() - Возвращает массив, содержащий все строки результирующего набора
- Функция PDOStatement::fetchColumn() - Возвращает данные одного столбца следующей строки результирующего набора
- Функция PDOStatement::fetchObject() - Извлекает следующую строку и возвращает ее в виде объекта
- Функция PDOStatement::getAttribute() - Получение значения атрибута запроса PDOStatement
- Функция PDOStatement::getColumnMeta() - Возвращает метаданные столбца в результирующей таблице
- Функция PDOStatement::nextRowset() - Переход к следующему набору строк в результате запроса
- Функция PDOStatement::rowCount() - Возвращает количество строк, модифицированных последним SQL запросом
- Функция PDOStatement::setAttribute() - Присваивает атрибут объекту PDOStatement
- Функция PDOStatement::setFetchMode() - Задает режим выборки по умолчанию для объекта запроса
Коментарии
In case this is helpful to anybody else who ends-up here after getting the following error:
SQLState: 24000 [Microsoft][ODBC SQL Server Driver]Invalid cursor state
PDOStatement :: closeCursor() did not fix the issue for me. However, adding SET NOCOUNT ON to the beginning of my stored procedure did.