Подтвердить что ты не робот

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

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

Я понимаю, что 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, когда вам не нужно использовать специальные поведения для первого?

4b9b3361

Ответ 1

Вы можете найти 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) поскольку многие считают, что лучше использовать кодирование для явного определения типов данных в объявлениях параметров.

Ответ 2

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

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

Ответ 3

Простой, значение 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