Чим відрізняється bindParam від bindValue?


Відповіді:


190

Відповідь міститься в документації для 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'

667

З ручного запису для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'

9
Блискуче, дякую! Запитання - чому ви хочете використовувати одне за іншим? Наприклад, коли було б корисно чи потрібно, щоб параметр прив'язки оцінювався лише під час Execute ()?
Coldblackice

32
@Coldblackice Якщо ви виконували запит кілька разів з різними даними. З bindValueвами потрібно буде кожен раз повторно зв’язувати дані. З bindParamвами просто потрібно буде оновити змінну. Основною причиною використання bindValueстали статичні дані, наприклад, буквальні рядки чи числа.
самотній день

1
Наприклад, ви хочете використовувати bindValue із значеннями повернення функції: $ stmt-> bindValue (': статус', strtolower ($ статус), PDO :: PARAM_STR);
платнийбурхріст

1
хотів внести внесок, але оскільки це 666, я залишу його
eddy147

219

Ось про що я можу подумати:

  • З bindParam, ви можете передавати лише змінні; не значення
  • з bindValue, ви можете передавати обидва (значення, очевидно, і змінні)
  • bindParamпрацює лише зі змінними, тому що дозволяє задавати параметри як введення / виведення за допомогою "посилання" (а значення не є дійсним "посиланням" у PHP) : це корисно з драйверами, які (цитуючи посібник):

підтримують виклик збережених процедур, які повертають дані як вихідні параметри, а деякі також як параметри вводу / виводу, які обидва надсилають дані та оновлюються для їх отримання.

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


@PascalMartin Тільки те, що я хотів знати, чи можна зв’язувати значення з bindParam. Ура.
yehuda

1
У мене ще немає поняття, що саме це означає, що саме є змінними та які значення. Я використовую bindParam, щоб прив'язати значення до заповнювача, і з bindValue я можу зробити те ж саме! - принаймні в моєму прикладі ...
Річард

29

З Підготовлених заяв та збережених процедур

Використовуйте 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();

27

Для найпоширенішої мети слід використовувати 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


4

Вам більше не доведеться боротися, коли існує такий спосіб:

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

4

Найпростіший спосіб поставити це в перспективу запам'ятовування за поведінкою (з точки зору PHP):

  • bindParam: довідник
  • bindValue: змінна
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.