Jaka jest różnica między bindParam a bindValue?

Jaka jest różnica między PDOStatement::bindParam() oraz PDOStatement::bindValue()?

Author: Adrian Cid Almaguer, 2009-07-25

8 answers

Odpowiedź jest w dokumentacji dla bindParam:

W Przeciwieństwie Do metody PDOStatement:: bindValue (), zmienna jest związana jako referencja i będzie oceniana tylko w momencie wywołania metody PDOStatement:: execute ().

Oraz execute

Wywołanie PDOStatement:: bindParam (), aby powiązać zmienne PHP ze znacznikami parametrów: powiązane zmienne przekazują ich wartość jako wejście i otrzymują wartość wyjściową, jeśli istnieje, z ich powiązanych znaczników parametrów

 168
Author: acrosman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-19 18:44:53

Z wpis ręczny dla PDOStatement::bindParam:

[z bindParam] W przeciwieństwie do PDOStatement::bindValue(), zmienna jest związana jako odniesienie i będzie oceniana tylko w momencie wywołania PDOStatement::execute().

Więc, na przykład:

$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'

Lub

$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'
 624
Author: lonesomeday,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-22 10:48:22

Oto niektóre, o których mogę pomyśleć:

  • z bindParam można przekazywać tylko zmienne, a nie wartości
  • z bindValue, można przekazać zarówno (wartości, oczywiście, i zmienne)
  • bindParam działa tylko ze zmiennymi, ponieważ pozwala na podanie parametrów jako wejścia/wyjścia, przez" referencję " (a wartość nie jest poprawną "referencją" w PHP) : jest to przydatne ze sterownikami, które (cytując podręcznik) :

Obsługa wywoływania przechowywanych procedury, które zwraca dane jako wyjście parametry, a niektóre również jako parametry wejścia/wyjścia, które obie wysyłają w danych i są aktualizowane, aby je otrzymać.

W niektórych silnikach DB, procedury przechowywane mogą mieć parametry, które mogą być używane zarówno dla wejścia (przekazującego wartość z PHP do procedury), jak i ouput (zwracającego wartość z zapisanego proc do PHP) ; aby powiązać te parametry, musisz użyć bindParam, a nie bindValue.

 207
Author: Pascal MARTIN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-24 20:12:36

Do najczęstszego celu należy użyć bindValue.

bindParam ma dwa trudne lub nieoczekiwane zachowania:

  • bindParam(':foo', 4, PDO::PARAM_INT) nie działa, ponieważ wymaga podania zmiennej (jako referencji).
  • bindParam(':foo', $value, PDO::PARAM_INT) zmieni $value na string po uruchomieniu execute(). To, oczywiście, może prowadzić do subtelnych błędów, które mogą być trudne do złapania.

Źródło: http://php.net/manual/en/pdostatement.bindparam.php#94711

 23
Author: Denilson Sá Maia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-10 21:03:06

From Prepared statements and stored procedures

Użyj bindParam, Aby wstawić wiele wierszy z jednym wiązaniem czasowym:

<?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();
 19
Author: Nezar Fadle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-10 06:16:20

Nie musisz się już męczyć, gdy istnieje sposób na to:

$stmt = $pdo->prepare("SELECT * FROM someTable WHERE col = :val");
$stmt->execute([":val" => $bind]); 
 1
Author: Thielicious,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-27 22:49:58

Najprostszy sposób ujęcia (pod względem PHP):

  • bindParam: odniesienie
  • bindValue: zmienna
 1
Author: tfont,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-04 15:39:58

Kluczową różnicą pomiędzy tymi dwoma metodami, którą można odczytać z dokumentacji dla bindParam(), jest sposób przekazania zmiennej parametru w wywołaniu procedury.

Metoda bindParam () powiąza znacznik parametru z nazwą zmiennej PHP, która będzie przechowywać wartość wyjściową, a nie samą wartość. Co więcej, jego wartość jest obliczana tylko w momencie wywołania metody PDOStatement:: execute ().

... zmienna jest związana jako referencja i będzie być obliczane tylko w momencie wywołania metody PDOStatement:: execute ().

Dla porównania, metoda bindValue () powiąza znacznik parametru z wartością zmiennej PHP, do której się odnosi, i dlatego jest natychmiast dostępna w momencie wywołania metody PDOStatement:: execute ().

Ważne jest, aby pamiętać podczas używania metody bindParam (), jeśli parametr jest parametrem wyjściowym, co oznacza, że wiąże się ze zmienną, która pobiera swoją wartość z procedury składowanej, to musisz jawnie ustaw długość zgodnie z zapisem w dokumentacji parametru length :

Długość

Długość typu danych. Aby wskazać, że parametr jest parametrem wyjściowym z procedury składowanej, należy wyraźnie ustawić długość.

Należy ustawić długość parametru wyjściowego, aby odpowiadała maksymalnej oczekiwanej długości zdefiniowanej w bazie danych.

 -1
Author: Crayons,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-30 13:10:08