В чем разница между bindParam и bindValue?
Вопрос
В чем разница между PDOStatement::bindParam()
и PDOStatement::bindValue()
?
Решение
Ответ содержится в документации для 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's value
$value = 'foobarbaz';
$s->execute(); // executed with WHERE baz = 'foo'
Другие советы
От ручной ввод для 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.
От Подготовленные инструкции и хранимые процедуры
Использование 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();
Для наиболее распространенной цели вам следует использовать 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
Вам больше не нужно бороться, когда существует способ сделать это:
$stmt = $pdo->prepare("SELECT * FROM someTable WHERE col = :val");
$stmt->execute([":val" => $bind]);
Самый простой способ представить это в перспективе для запоминания по поведению (с точки зрения PHP):
bindParam:
ссылкаbindValue:
переменная