Jaka jest różnica między PDOStatement::bindParam()
i PDOStatement::bindValue()
?
Jaka jest różnica między PDOStatement::bindParam()
i PDOStatement::bindValue()
?
Odpowiedzi:
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. Po bindParam
prostu musisz zaktualizować zmienną. Głównym powodem użycia bindValue
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):obsługuje wywoływanie procedur przechowywanych, które zwracają dane jako parametry wyjściowe, a niektóre również jako parametry wejściowe / wyjściowe, które zarówno wysyłają dane, jak i są aktualizowane w celu ich odebrania.
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.
Z przygotowanych instrukcji i procedur przechowywanych
Służy bindParam
do wstawiania wielu 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();
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 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
Nie musisz już dłużej walczyć, jeśli istnieje sposób, aby to zrobić:
$stmt = $pdo->prepare("SELECT * FROM someTable WHERE col = :val");
$stmt->execute([":val" => $bind]);