Я часто вижу код с помощью 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