В чем разница между bindParam и bindValue?
В чем разница между PDOStatement::bindParam()
и PDOStatement::bindValue()
?
8 answers
Ответ содержится в документации для bindParam
:
В отличие от PDOStatement::bindValue(), переменная привязана как ссылка и будет оцениваться только во время вызова PDOStatement::execute().
И execute
Вызовите PDOStatement::bindParam() для привязки переменных PHP к маркерам параметров: связанные переменные передают свое значение в качестве входных данных и получают выходное значение, если таковое имеется, связанного с ними параметра маркеры
Из ручной ввод для PDOStatement::bindParam
:
[С
bindParam
] В отличие отPDOStatement::bindValue()
, переменная привязана как ссылка и будет оцениваться только во время вызоваPDOStatement::execute()
.
Так, например:
$sex = 'male';
$s = $dbh->prepare('SELECT name FROM students WHERE sex = :sex');
$s->bindParam(':sex', $sex); // use bindParam to bind the variable
$sex = 'female';
$s->execute(); // executed with WHERE sex = 'female'
Или
$sex = 'male';
$s = $dbh->prepare('SELECT name FROM students WHERE sex = :sex');
$s->bindValue(':sex', $sex); // use bindValue to bind the variable's value
$sex = 'female';
$s->execute(); // executed with WHERE sex = 'male'
Вот некоторые из них, о которых я могу подумать:
- С помощью
bindParam
вы можете передавать только переменные, а не значения - с помощью
bindValue
вы можете передавать оба (значения, очевидно, и переменные) -
bindParam
работает только с переменными, потому что позволяет задавать параметры в качестве ввода/вывода с помощью "ссылки" (и значение не является допустимой "ссылкой" в PHP): это полезно для драйверов, которые (цитируя руководство):
Поддержка вызова хранимых процедур которые возвращают данные в качестве выходных параметров, а некоторые также в качестве входных/выходных параметров, которые одновременно отправляют данные и обновляются для их получения.
В некоторых движках БД хранимые процедуры могут иметь параметры, которые могут использоваться как для ввода (передачи значения из PHP в процедуру), так и для вывода (возврата значения из сохраненного процесса в PHP); для привязки этих параметров вы должны использовать bindParam, а не bindValue.
Для наиболее распространенных целей вам следует использовать bindValue
.
bindParam
имеет два сложных или неожиданных поведения:
-
bindParam(':foo', 4, PDO::PARAM_INT)
не работает, так как для этого требуется передать переменную (в качестве ссылки). -
bindParam(':foo', $value, PDO::PARAM_INT)
изменит$value
на строку после запускаexecute()
. Это, конечно, может привести к незаметным ошибкам, которые может быть трудно поймать.
Источник: http://php.net/manual/en/pdostatement.bindparam.php#94711
Из Подготовленных инструкций и хранимых процедур
Используйте bindParam
для вставки нескольких строк с однократной привязкой:
<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);
// insert one row
$name = 'one';
$value = 1;
$stmt->execute();
// insert another row with different values
$name = 'two';
$value = 2;
$stmt->execute();
Вам больше не нужно бороться, когда есть способ сделать это:
$stmt = $pdo->prepare("SELECT * FROM someTable WHERE col = :val");
$stmt->execute([":val" => $bind]);
Самый простой способ выразить это (с точки зрения PHP):
-
bindParam:
ссылка -
bindValue:
переменная
Ключевое различие между двумя методами, которое можно прочитать из документации для bindParam(), заключается в том, как переменная параметра передается при вызове процедуры.
Метод bindParam() свяжет маркер параметра с именем переменной PHP, которая будет содержать выходное значение, а не само значение. Кроме того, его значение оценивается только во время вызова PDOStatement::execute().
... переменная привязана как ссылка и будет оцениваться только во время вызова PDOStatement::execute().
Для сравнения, метод bindValue() свяжет маркер параметра со значением переменной PHP, на которую он ссылается, и, следовательно, будет немедленно доступен во время вызова PDOStatement::execute().
При использовании метода bindParam() важно отметить, что если ваш параметр является параметром OUT, то есть он привязывается к переменной, которая получает свое значение из хранимой процедуры, то вы необходимо явно задать длину, как указано в документации по параметру длины :
Длина
Длина типа данных. Чтобы указать, что параметр является выходным параметром хранимой процедуры, необходимо явно задать длину.
Вы должны установить длину выходного параметра, чтобы она соответствовала максимальной ожидаемой длине, определенной в вашей базе данных.