Вопрос

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

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

  • С 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#94711

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

$stmt = $pdo->prepare("SELECT * FROM someTable WHERE col = :val");
$stmt->execute([":val" => $bind]); 

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

  • bindParam: ссылка
  • bindValue: переменная
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top