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