Intereting Posts
Объедините два массива бок о бок, где один может быть короче другого Увеличение таймаута по умолчанию для приложения PHP PHP: Кириллические (русские) символы повторяются как «Вопросительные знаки». Зачем? Обрезаемая фатальная ошибка: объект класса PDOStatement не может быть преобразован в строку в D $ result = mysql_query () Установка композитора: расширение json отсутствует В PHP, какова разница между объявлением переменной как глобальной внутренней функции или передачей переменной в качестве аргумента функции? Активный токен доступа должен использоваться для запроса информации о текущем исключении пользователя-Graph api Проверьте, была ли еще вызвана функция PHP Упростите тройную операцию PHP Проверять кодированные изображения base64 Структура кодирования для списка действий Проблема с PHP mysql bigint Сортировка подкачки в Cakephp 3.x Как создать файл CSV с помощью PHP (и загрузить его)

Является ли вызов PDOStatement :: closeCursor () необходимым, если объект оператора отключен?

Я использую 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).

Существующий материал в Stackoverflow

Чарльз вернулся в мае 2011 года в вопрос pdo :

Не только некоторые драйверы – некоторые настройки, предоставляемые драйверами, требуют закрытия набора результатов перед отключением другого запроса, например, отключения PDO::MYSQL_ATTR_USE_BUFFERED_QUERY MySQL PDO::MYSQL_ATTR_USE_BUFFERED_QUERY . К счастью, вы можете вызвать closeCursor и он ничего не добьется, когда ему не нужно принимать меры. В противном случае просто отключить переменную, содержащую дескриптор инструкции, будет очищена.

Другой вопрос: Когда я должен использовать closeCursor () для операторов PDO? не имеет принятого ответа, о котором я не задумываюсь, потому что все это очень странно.

При повторном выполнении PDO-инструкции var сбрасывает процесс, возникает комментарий, который делает невозможным удаление всех ошибок (ошибок повреждения памяти):

[…] Я попытался отключить инструкцию var перед ее переназначением, но это не помогло. […]

Однако я не знаю, верно ли это для локальных переменных, масштаб которых не будет удален. Я также не использую mod_php как SAPI.

Связанный материал

  • Ошибка # 66878 Несколько наборов строк не возвращаются, если объект инструкции PDO не установлен ()

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, который не освободит ожидающий результат запроса, вы столкнетесь с ошибкой.