Jaka jest różnica między PDOStatement::bindParam()
i PDOStatement::bindValue()
?
378
Jaka jest różnica między PDOStatement::bindParam()
i PDOStatement::bindValue()
?
Odpowiedź znajduje się w dokumentacji bindParam
:
W przeciwieństwie do PDOStatement :: bindValue (), zmienna jest powiązana jako odwołanie i będzie oceniana tylko w momencie wywołania PDOStatement :: execute ().
I execute
wywołaj PDOStatement :: bindParam (), aby powiązać zmienne PHP ze znacznikami parametrów: zmienne powiązane przekazują swoją wartość jako dane wejściowe i otrzymują wartość wyjściową, jeśli taka istnieje, z powiązanych znaczników parametrów
Przykład:
$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'
lub
$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'
Z ręcznego wpisu dlaPDOStatement::bindParam
:
[With
bindParam
] W przeciwieństwie doPDOStatement::bindValue()
tej zmiennej zmienna jest powiązana jako odwołanie i będzie oceniana tylko w momencie jejPDOStatement::execute()
wywołania.
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'
bindValue
którą trzeba ponownie powiązać dane za każdym razem. PobindParam
prostu musisz zaktualizować zmienną. Głównym powodem użyciabindValue
byłyby dane statyczne, np. Ciągi liter lub liczby.Oto kilka rzeczy, o których mogę pomyśleć:
bindParam
możesz przekazywać tylko zmienne; nie wartościbindValue
można przekazać obie wartości (oczywiście wartości i zmienne)bindParam
działa tylko ze zmiennymi, ponieważ pozwala podawać parametry jako dane wejściowe / wyjściowe przez „referencję” (a wartość nie jest prawidłową „referencją” w PHP) : przydatne w przypadku sterowników (cytowanie instrukcji):W przypadku niektórych silników DB procedury składowane mogą mieć parametry, które mogą być używane zarówno dla danych wejściowych (podając wartość z PHP do procedury), jak i dla wyjścia (zwracając wartość z przechowywanego proc do PHP); aby powiązać te parametry, musisz użyć bindParam, a nie bindValue.
źródło
Z przygotowanych instrukcji i procedur przechowywanych
Służy
bindParam
do wstawiania wielu wierszy z jednym wiązaniem czasowym:źródło
W najczęstszym celu powinieneś użyć
bindValue
.bindParam
ma dwa trudne lub nieoczekiwane zachowania:bindParam(':foo', 4, PDO::PARAM_INT)
nie działa, ponieważ wymaga przekazania zmiennej (jako odniesienia).bindParam(':foo', $value, PDO::PARAM_INT)
zmieni się$value
na ciąg po uruchomieniuexecute()
. 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
źródło
Nie musisz już dłużej walczyć, jeśli istnieje sposób, aby to zrobić:
źródło
Najprostszy sposób, aby umieścić to w perspektywie do zapamiętywania według zachowania (pod względem PHP):
bindParam:
odniesieniebindValue:
zmiennaźródło