Jaka jest różnica między bindParam a bindValue?
Jaka jest różnica między PDOStatement::bindParam()
oraz PDOStatement::bindValue()
?
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
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 doPDOStatement::bindValue()
, zmienna jest związana jako odniesienie i będzie oceniana tylko w momencie wywołaniaPDOStatement::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'
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.
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 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
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();
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]);
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
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.
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