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