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

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

7 ответов

Решение

Ответ в документации для 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.

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

использование 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();

Для наиболее распространенной цели, вы должны использовать bindValue,

bindParam имеет два хитрых или неожиданных поведения:

  • bindParam(':foo', 4, PDO::PARAM_INT) не работает, так как требует передачи переменной (в качестве ссылки).
  • bindParam(':foo', $value, PDO::PARAM_INT) изменится $value нанизывать после бега execute(), Это, конечно, может привести к тонким ошибкам, которые трудно обнаружить.

Источник: http://php.net/manual/en/pdostatement.bindparam.php

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

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

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

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

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

Другие вопросы по тегам