В чем разница между PDOStatement::bindParam()
и PDOStatement::bindValue()
?
378
В чем разница между 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'
bindValue
вам нужно будет повторно привязывать данные каждый раз. С помощьюbindParam
вам просто нужно обновить переменную. Основной причиной использованияbindValue
будут статические данные, например, буквенные строки или числа.Вот некоторые, о которых я могу думать:
bindParam
вы можете передавать только переменные; не ценностиbindValue
, вы можете передать как (значения, очевидно, и переменные)bindParam
работает только с переменными, потому что позволяет задавать параметры в качестве ввода / вывода, используя «ссылку» (а значение не является допустимой «ссылкой» в PHP) : это полезно для драйверов, которые (цитируя руководство):В некоторых механизмах БД хранимые процедуры могут иметь параметры, которые можно использовать как для ввода (давая значение из PHP в процедуру), так и для вывода (возвращая значение из хранимого процесса в PHP); чтобы связать эти параметры, вы должны использовать bindParam, а не bindValue.
источник
Из подготовленных выписок и хранимых процедур
Используйте
bindParam
для вставки нескольких строк с одной временной привязкой:источник
Для наиболее распространенной цели, вы должны использовать
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
источник
Вам больше не нужно бороться, когда есть способ, как это:
источник
Самый простой способ поместить это в перспективу для запоминания поведением (с точки зрения PHP):
bindParam:
ссылкаbindValue:
переменнаяисточник