Intereting Posts
Что быстрее в PHP, одинарные или двойные кавычки? Более сжатый способ проверить, содержит ли массив только числа (целые числа) PHP cURL в аутентифицированный сайт, когда он уже вошел в систему Что означает \ d + в терминах регулярного выражения? обмениваться сеансом между классическим ASP и PHP, чем использовать базу данных Создание Restful API, какие заголовки должны быть выпущены перед ответом? Один фильтр не работает, когда предложение where имеет указанное значение Может ли модель иметь несколько таблиц в CakePHP? Laravel MethodNotAllowedHttpException в форме POST Разделить на разные разделители, сохраняя разделитель? API API Analytics: неверный запрос – invalid_grant upstream отправляет слишком большой заголовок при чтении заголовка ответа от восходящего потока Javascript не загружается при начальной загрузке страницы Facebook PHP SDK, посвященный токенам доступа Как отправить данные формы с моего сайта на мой адрес электронной почты?

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

В чем разница между 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 работает только с переменными, потому что он позволяет параметрам задаваться как входные / выходные данные посредством «reference» (а значение не является допустимой «ссылкой» в 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(); 

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

  • bindParam: ресурс
  • bindValue: переменная

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

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