Я использую PDO-соединение на основе Mysql с PDOStatement ( ::prepare()
; ::execute()
), и я использовал некоторый код от предыдущего разработчика, который использует PDOStatement::closeCursor()
в методе.
В любом случае утверждение не будет установлено в конце функции:
public function fooBar($identifier) { ... /** @var $dbc PDO */ $dbc = $conn->getConnection(); $stmt = $dbc->prepare('SELECT orderType, orderComment, payload FROM cart WHERE identifier = :identifier'); $stmt->execute(array('identifier' => $identifier)); $stmt->setFetchMode(PDO::FETCH_OBJ); $cart = $stmt->fetch(); $stmt->closeCursor(); ... return $result; }
В моей ментальной модели я бы сказал, что PDOStatement здесь все равно очищается, так как я exepect объект, чтобы позаботиться об этом домашнем хозяйстве (основы инкапсуляции). Поэтому вызов PDOStatement::closeCursor()
выглядит для меня более чем правдоподобным, тем более, что это может быть не совсем то, что нужно здесь: поскольку оператор не должен использоваться повторно, мне вообще не нужно закрывать курсор.
side-note: этот код является образцовым, в реальном коде есть даже исключение,
$stmt->execute(...)
после$stmt->execute(...)
если число строк не одно (1).
Чарльз вернулся в мае 2011 года в вопрос pdo :
Не только некоторые драйверы – некоторые настройки, предоставляемые драйверами, требуют закрытия набора результатов перед отключением другого запроса, например, отключения
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY
MySQLPDO::MYSQL_ATTR_USE_BUFFERED_QUERY
. К счастью, вы можете вызватьcloseCursor
и он ничего не добьется, когда ему не нужно принимать меры. В противном случае просто отключить переменную, содержащую дескриптор инструкции, будет очищена.
Другой вопрос: Когда я должен использовать closeCursor () для операторов PDO? не имеет принятого ответа, о котором я не задумываюсь, потому что все это очень странно.
При повторном выполнении PDO-инструкции var сбрасывает процесс, возникает комментарий, который делает невозможным удаление всех ошибок (ошибок повреждения памяти):
[…] Я попытался отключить инструкцию var перед ее переназначением, но это не помогло. […]
Однако я не знаю, верно ли это для локальных переменных, масштаб которых не будет удален. Я также не использую mod_php
как SAPI.
pdo_mysql_stmt_dtor()
выполняет те же операции очистки, что и pdo_mysql_stmt_cursor_closer()
, поэтому, если объект оператора либо явно отключен, либо выходит за пределы области действия, операции всегда будут выполняться.
Поэтому не обязательно вызывать closeCursor()
если утверждение все равно будет уничтожено. Лично я бы сделал это в любом случае, поскольку мне нравится быть явным для удобочитаемости, но это сводится к личным стилистическим предпочтениям.
Основываясь на вышеприведенных ссылках, это можно сказать только о PDO_mysql – для других драйверов это может оказаться неверным.
Мое понимание PDOStatement::closeCursor()
заключается в том, что он очищает результат выполненного запроса. Но не влияет на PDOStatement
вообще (просто результат его выполнения).
Из PHP Documnetation об этом методе :
освобождает соединение с сервером, так что могут выдаваться другие SQL-запросы
а также
Этот метод полезен для драйверов баз данных, которые не поддерживают выполнение объекта PDOStatement, когда ранее выполненный объект PDOStatement по-прежнему имеет свободные строки.
позвольте мне предположить, что вы должны сделать после каждого выполнения и выборки всех необходимых данных из текущего выполнения запроса вызова PDOStatement::closeCursor()
. Я думаю, что драйвер MySQL для PDO делает это автоматически, но, похоже, есть проблемы с некоторыми драйверами, которые автоматически не освобождают результат.
Поэтому, если вы переключитесь на другой драйвер DB, который не освободит ожидающий результат запроса, вы столкнетесь с ошибкой.