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