PDO bindParam против выполнения

Я часто вижу код с помощью bindParam или bindValue с PDO. Просто передайте аргументы для того, чтобы нахмуриться по какой-либо причине?

Я понимаю, что bindParam фактически привязывается к переменным и вы можете установить тип параметра, связанный с двумя методами bind , но что, если вы только вставляете строки?

 $query = "SELECT col1 FROM t1 WHERE col2 = :col2 AND col3 = :col3 AND col4 = :col4"; $pdo->bindValue(':col2', 'col2'); $pdo->bindValue(':col3', 'col3'); $pdo->bindValue(':col4', 'col4'); 

Я часто вижу выше, но лично я предпочитаю:

 $pdo->execute(array(':col2' => 'col2', ':col3' => 'col3', ':col4' => 'col4')); 

Это не так много подробностей и визуально имеет смысл для меня иметь входы, «входящие» в запрос вместе. Тем не менее, я почти никогда не видел, чтобы он использовался.

Есть ли причина предпочесть методы bind сравнению с передаваемыми параметрами для execute когда вам не нужно использовать особые поведения первого?

Вы можете найти bindParam используется, когда вы просто хотите привязать ссылку на переменную к параметру в запросе, но, возможно, еще нужно сделать некоторые манипуляции на нем и только хотите, чтобы значение переменной вычислялось во время выполнения запроса. Он также позволяет вам выполнять более сложные вещи, такие как привязка параметра к вызову хранимой процедуры и добавление возвращаемого значения в связанную переменную.

Подробнее см. Документацию bindParam, документацию bindValue и выполнить документацию .

Например

 $col1 = 'some_value'; $pdo->bindParam(':col1', $col1); $col1 = 'some_other_value'; $pdo->execute(); // would use 'some_other_value' for ':col1' parameter 

bindValue и передача массива для execute ведут себя примерно так же, как значение параметра фиксировано в этой точке, и SQL выполняется соответствующим образом.

Следуя тому же примеру выше, но используя bindValue

 $col1 = 'some_value'; $pdo->bindValue(':col1', $col1); $col1 = 'some_other_value'; $pdo->execute(); // would use 'some_value' for ':col1' parameter 

При передаче значений непосредственно в execute все значения рассматриваются как строки (даже если задано целочисленное значение). Поэтому, если вам нужно применять типы данных, вы всегда должны использовать bindValue или bindParam .

Я думаю, вы могли бы видеть, что bind* используется больше, чем execute(array) поскольку многие считают, что лучше использовать кодирование для явного определения типов данных в объявлениях параметров.

$pdo->execute() параметры вместе с $pdo->execute() , все значения в массиве передаются как PDO::PARAM_STR в оператор с помощью функции $pdo->bindParam() .

Основное различие, которое я вижу сейчас, заключается в том, что с помощью функции $pdo->bindParam() вы можете определить тип данных, переданный вместе с использованием констант PDO::PARAM_* как описано в руководстве PHP.net

Простой, значение bindParam может измениться, но значение bindValue не может измениться. Пример:

 $someVal=10; $someVal2=20; /* In bindParam, the value argument is not bound and will be changed if we change its value before execute. */ $ref->bindParam(':someCol',$someVal); $someVal=$someVal2; $ref->execute(); //someCol=20 /* In bindValue, the value argument is bound and never changed if we change its value before execute. */ $ref->bindValue(':someCol',$someVal); // here assignment is referral (&$someVal) $someVal=$someVal2; $ref->execute(); //someCol=10