У чому різниця між PDOStatement::bindParam()
і PDOStatement::bindValue()
?
У чому різниця між 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'
bindValue
вами потрібно буде кожен раз повторно зв’язувати дані. З bindParam
вами просто потрібно буде оновити змінну. Основною причиною використання bindValue
стали статичні дані, наприклад, буквальні рядки чи числа.
Ось про що я можу подумати:
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