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