PDO-> bindParam, PDO-> bindValue и PDO-> closeCursor

До сих пор я использовал 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********************// } в $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?

    «Повторяющийся» 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() когда нет набора результатов (т. closeCursor() Только с SELECT или процедурами, возвращающими результаты), но обычно я уже делал fetchAll где-то в предыдущем выражении / строке.

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

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

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

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

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

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

    Если вам не нужен оператор closeCursor:

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

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

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