В чем разница между bindParam и bindValue?


В чем разница между PDOStatement::bindParam() и PDOStatement::bindValue()?

Author: Adrian Cid Almaguer, 2009-07-25

8 answers

Ответ содержится в документации для bindParam:

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

И execute

Вызовите PDOStatement::bindParam() для привязки переменных PHP к маркерам параметров: связанные переменные передают свое значение в качестве входных данных и получают выходное значение, если таковое имеется, связанного с ними параметра маркеры

 168
Author: acrosman, 2013-10-19 18:44:53

Из ручной ввод для 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'
 624
Author: lonesomeday, 2011-02-22 10:48:22

Вот некоторые из них, о которых я могу подумать:

  • С помощью bindParam вы можете передавать только переменные, а не значения
  • с помощью bindValue вы можете передавать оба (значения, очевидно, и переменные)
  • bindParam работает только с переменными, потому что позволяет задавать параметры в качестве ввода/вывода с помощью "ссылки" (и значение не является допустимой "ссылкой" в PHP): это полезно для драйверов, которые (цитируя руководство):

Поддержка вызова хранимых процедур которые возвращают данные в качестве выходных параметров, а некоторые также в качестве входных/выходных параметров, которые одновременно отправляют данные и обновляются для их получения.

В некоторых движках БД хранимые процедуры могут иметь параметры, которые могут использоваться как для ввода (передачи значения из PHP в процедуру), так и для вывода (возврата значения из сохраненного процесса в PHP); для привязки этих параметров вы должны использовать bindParam, а не bindValue.

 207
Author: Pascal MARTIN, 2009-07-24 20:12:36

Для наиболее распространенных целей вам следует использовать 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

 23
Author: Denilson Sá Maia, 2014-07-10 21:03:06

Из Подготовленных инструкций и хранимых процедур

Используйте 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();
 19
Author: Nezar Fadle, 2016-03-10 06:16:20

Вам больше не нужно бороться, когда есть способ сделать это:

$stmt = $pdo->prepare("SELECT * FROM someTable WHERE col = :val");
$stmt->execute([":val" => $bind]); 
 1
Author: Thielicious, 2017-07-27 22:49:58

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

  • bindParam: ссылка
  • bindValue: переменная
 1
Author: tfont, 2018-07-04 15:39:58

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

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

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

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

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

Длина

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

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

 -1
Author: Crayons, 2018-03-30 13:10:08