Подтвердить что ты не робот

Когда следует использовать closeCursor() для операторов PDO?

Документация PHP на closeCursor() говорит, что она

освобождает соединение с сервером, так что могут выдаваться другие операторы SQL, но оставляет оператор в состоянии, которое позволяет выполнить его снова.

Когда я использовал команду, хотя это, похоже, не имеет значения, если она есть или нет между моими заявлениями запроса, и я начинаю задаваться вопросом, нужен ли мне это вообще.

Разве можно использовать его для вызовов базы данных, которые не возвращают данные, а не те, которые делают?

4b9b3361

Ответ 1

Это зависит от используемого драйвера. Я думаю, что для mysql это ничего не сделает, кроме как очистить результат инструкции. После вызова функции closeCursor() вы больше не можете вызвать fetch(). Однако выполнение инструкции снова не должно быть проблемой. Попытайтесь посмотреть mysql_free_result(), это делает аналогичную вещь.

Ответ 2

Чтобы ответить на вопрос для MySql

Как упоминалось в N.B. перед выполнением() того же подготовленного PDOStatement.

EG: (это плохая практика, но простой пример, как правило, вы должны использовать FetchAll или JOIN.   Более сложные сценарии, например, с вложенными запросами (см. Выше о JOIN), делают этот пример более жизнеспособным)

<?php
$ids = array( 1, 2 );
$sth = $pdo->prepare( "SELECT name FROM company WHERE id = :id" );
foreach( $ids as $id ) {
  $sth->execute( array( ':id' => $id ) );
  $result = $sth->fetch( PDO::FETCH_ASSOC );
  $sth->closeCursor();
  echo $result['name'] . PHP_EOL;
}
unset( $result );
$sth = null;
$pdo = null;
?>

Также, как и для MySQL, вы также можете установить атрибут PDO:: MYSQL_ATTR_USE_BUFFERED_QUERY равным false, что требует, чтобы PHP всегда проверял базу данных и не нуждался в закрытии курсора. http://php.net/manual/en/mysqlinfo.concepts.buffering.php