Вопрос

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

Это было полезно?

Решение

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

Другие советы

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

Например, если вы выберете все записи из таблицы, то выпустите $ STMT-> FETCH (), это на самом деле выполняет цель к CloseCursor сразу же, когда строки теперь больше не в своем статусе.

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

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

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

  • Если ваш драйвер DB не разрешает выполнение нового STMT, когда Revected Rows доступен из предыдущего выполнения
  • У вас есть несколько подготовленных операторов и хотели бы выполнить их один после другого ($ STMT1-> Execute (); $ STMT-> Cleancursor (); $ STMT2-> Execute (); $ STMT2-> Cleancursor (); $ STMT3 ... и т. Д.)
  • У вас есть несколько STMTS, которые должны выполнять вставку / обновление / удалить внутри одного блока. Это правда, потому что, пока вы не получаете результаты Row MySQL, вы получаете количество пострадавших в результате строки, установленные назад (что еще является результатом).
  • При использовании транзакций
  • Когда вы хотите выдать подготовленные избрасывания в стиле выбора и выполнить их, но не извлекать данные до позднего

Когда вам не нужна заявление о закрытии:

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top