В чем разница между PDOStatement::bindParam()
и PDOStatement::bindValue()
?
В чем разница между bindParam и bindValue?
Ответ 1
Ответ находится в документации для bindParam
:
В отличие от PDOStatement :: bindValue(), переменная связана как ссылка и будет оценена только в момент вызова PDOStatement :: execute().
И execute
вызов PDOStatement :: bindParam() для привязки PHP-переменных к маркерам параметров: связанные переменные передают свое значение в качестве входных данных и получают выходное значение, если оно есть, связанных с ними маркеров параметров
Пример:
$value = 'foo';
$s = $dbh->prepare('SELECT name FROM bar WHERE baz = :baz');
$s->bindParam(':baz', $value); // use bindParam to bind the variable
$value = 'foobarbaz';
$s->execute(); // executed with WHERE baz = 'foobarbaz'
или
$value = 'foo';
$s = $dbh->prepare('SELECT name FROM bar WHERE baz = :baz');
$s->bindValue(':baz', $value); // use bindValue to bind the variable value
$value = 'foobarbaz';
$s->execute(); // executed with WHERE baz = 'foo'
Ответ 2
От ввод вручную для 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 value
$sex = 'female';
$s->execute(); // executed with WHERE sex = 'male'
Ответ 3
Вот некоторые из них, о которых я могу думать:
- С
bindParam
вы можете передавать только переменные; не значения - с
bindValue
, вы можете передать оба значения (значения, очевидно, и переменные) -
bindParam
работает только с переменными, поскольку позволяет параметрам задаваться как входные/выходные данные посредством "reference" (а значение не является допустимой "ссылкой" в PHP): полезно с драйверами, которые (цитируя руководство):
поддерживает вызов сохраненного процедуры, возвращающие данные как выходные данные параметры, а некоторые также параметры ввода/вывода, которые отправляются в данных и обновляется для его получения.
С некоторыми механизмами БД хранимые процедуры могут иметь параметры, которые могут использоваться как для ввода (дающего значение от PHP к процедуре), так и для вывода (возвращающего значение из хранимого proc на PHP); чтобы связать эти параметры, вы должны использовать bindParam, а не bindValue.
Ответ 4
Из Подготовленные утверждения и хранимые процедуры
Используйте 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();
Ответ 5
Для наиболее общей цели вы должны использовать 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
Ответ 6
Самый простой способ поместить это в перспективу для запоминания поведением (с точки зрения PHP):
bindParam:
ссылка- Переменная
bindValue:
Ответ 7
Вам больше не нужно бороться, когда существует способ lilke this:
$stmt = $pdo->prepare("SELECT * FROM someTable WHERE col = :val");
$stmt->execute([":val" => $bind]);
Ответ 8
Ключевое различие между двумя методами, которое можно прочитать из документа для bindParam(), заключается в том, как передается переменная параметра в вызове процедуры.
Метод bindParam() привяжет маркер параметра к имени переменной PHP, которая будет содержать выходное значение, а не значение. Кроме того, это значение оценивается только тогда, когда вызывается PDOStatement :: execute().
... переменная привязана как ссылка и будет оцениваться только в момент вызова PDOStatement :: execute().
Для сравнения, метод bindValue() привяжет маркер параметра к значению переменной PHP, ссылающейся на него, и поэтому сразу же доступен в момент вызова PDOStatement :: execute().
Важно отметить, что при использовании метода bindParam(), если ваш параметр является параметром OUT, то есть он привязывается к переменной, которая получает свое значение из хранимой процедуры, тогда вы должны явно указать длину, как указано в документации параметра длины:
длина
Длина типа данных. Чтобы указать, что параметр является параметром OUT из хранимой процедуры, вы должны явно задать длину.
Вы должны установить длину выходного параметра в соответствии с максимальной ожидаемой длиной, определенной в вашей базе данных.