PDO-> bindParam, PDO-> bindValue и PDO-> closeCursor - PullRequest
1 голос
/ 16 сентября 2010

До сих пор я использовал PDO->bindParam, однако, читая руководство, я нашел PDO->bindValue из того, что я могу сказать PDO->bindValue проходит по значению, где PDO->bindParam проходит по ссылке, это единственная разница?*

$modThread = db()->prepare("UPDATE `threads` SET `modtime` = UNIX_TIMESTAMP( ) WHERE `threadid` =:id LIMIT 1");

while(something)
{
        $modThread->bindParam(':id', $thread);
        $modThread->execute();
//*******************HERE********************//
}

Снова, читая руководство, я обнаружил: PDO->closeCursor я должен разместить его там, где отмечено?Это необязательно / автоматически вызывается?Кажется, это нужно только определенным водителям.Вызовет ли это драйвер, который не нуждается / не поддерживает его, приведет к ошибкам?Как насчет MySQL?

Ответы [ 2 ]

5 голосов
/ 11 ноября 2011

Это не правда.Если вам нужно использовать closeCursor, один из наиболее оптимальных вариантов - для команд вставки / обновления / удаления и редко для операторов SELECT, для которых вы уже получили результаты.

Например, если выбрать всезаписи из таблицы, затем выполните $ stmt-> fetch (), это на самом деле сразу же завершает задачу closeCursor, так как строки больше не находятся в неустановленном состоянии.

Из руководства:

Этот метод полезен для драйверов базы данных, которые не поддерживают выполнение объекта PDOStatement, когда ранее выполненный объект PDOStatement все еще имеет невыполненные строки.Если драйвер вашей базы данных страдает от этого ограничения, проблема может проявиться в ошибке из последовательности:

Когда вам действительно понадобится closeCursor, во время любого из следующих случаев:

  • Если ваш драйвер БД не разрешает выполнение нового stmt, в то время как из предыдущего выполнения доступны невыполненные строки
  • У вас есть несколько подготовленных операторов и вы хотите выполнить их один за другимдругой ($ stmt1-> execute (); $ stmt-> closeCursor (); $ stmt2-> execute (); $ stmt2-> closeCursor (); $ stmt3 ... и т. д.)
  • У вас есть несколькоstmts, которые должны выполнить вставку / обновление / удаление внутри того же блока.Это верно, потому что, хотя вы не получаете обратно результаты строк mysql, вы ДОЛЖНЫ возвращать количество результатов для затронутых строк (что все еще является результатом).
  • При использовании транзакций
  • Когда вы хотите выдавать подготовленные операторы в стиле выбора и выполнять их, но не извлекаете данные до тех пор, пока

Когда вы этого не сделаетенужен оператор closeCursor:

  • Если вы уже извлекли строки (как с $ stmt-> fetch ()) до того, как ваш следующий оператор будет выполнен.На этом этапе строки находятся в «извлеченном» состоянии и освобождают драйвер для выполнения новых операторов.

Так же полезно для закрытия курсора unset () (то есть: unset ($ stmt)) и установив для оператора значение null ($ stmt = null), открывая двери для встроенного сборщика мусора, чтобы все очистить.

См. руководство для получения дополнительной информации: http://php.net/manual/en/pdostatement.closecursor.php

1 голос
/ 16 сентября 2010

«Повторяющиеся» bindParam() здесь на самом деле не нужны:

$thread = 0;
$modThread->bindParam(':id', $thread);

while($thread < 20)
{
    $thread++;
    $modThread->execute(); //executing with the new value, which you couldn't do with bindValue
}

Вам не нужно closeCursor(), когда нет набора результатов (то есть, только с SELECT с или процедурами, возвращающими результаты), но обычно я уже сделал fetchAll где-то в предыдущем выражении / строке.

...