У чому різниця між 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