В чем разница между 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]); 

самый простой способ поставить его (с точки зрения PHP):

  • bindParam: ссылка
  • bindValue: переменная

ключевое различие между двумя методами, которое можно прочитать из documention для bindParam(), как переменная параметра передается в вызове процедуры.

метод bindParam () свяжет маркер параметра с именем переменной PHP, которая будет содержать выходное значение, а не само значение. Кроме того, его значение оценивается только во время вызова PDOStatement::execute ().

... переменная привязана в качестве ссылки и будет оцениваться только во время вызова PDOStatement::execute ().

для сравнения, метод bindValue() будет привязывать маркер параметра к значению переменной PHP, на которую он ссылается, и поэтому сразу доступен во время вызова PDOStatement::execute ().

важно отметить, что при использовании метода bindParam (), если ваш параметр является параметром OUT, это означает, что он привязывается к переменной, которая получает свое значение из хранимой процедуры необходимо явно задать длину, как указано в документация по параметру длины:

длина

длина типа данных. Чтобы указать, что параметр является параметром OUT хранимой процедуры, необходимо явно задать длину.

вы должны установить длину выходного параметра в соответствии с максимальной ожидаемой длиной, определенной в вашей базе данных.