Quelle est la difference entre PDOStatement::bindParam()
et PDOStatement::bindValue()
?
378
Quelle est la difference entre PDOStatement::bindParam()
et PDOStatement::bindValue()
?
La réponse se trouve dans la documentation de bindParam
:
Contrairement à PDOStatement :: bindValue (), la variable est liée comme référence et ne sera évaluée qu'au moment où PDOStatement :: execute () est appelé.
Et execute
appelez PDOStatement :: bindParam () pour lier des variables PHP aux marqueurs de paramètre: les variables liées passent leur valeur en entrée et reçoivent la valeur de sortie, le cas échéant, de leurs marqueurs de paramètre associés
Exemple:
$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'
ou
$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'
De l'entrée manuelle pourPDOStatement::bindParam
:
[Avec
bindParam
] Contrairement àPDOStatement::bindValue()
, la variable est liée comme référence et ne sera évaluée qu'au moment de l'PDOStatement::execute()
appel.
Ainsi, par exemple:
$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'
ou
$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
vous, vous devez à nouveau lier les données à chaque fois. AvecbindParam
vous auriez juste besoin de mettre à jour la variable. La principale raison de l'utilisationbindValue
serait des données statiques, par exemple des chaînes littérales ou des nombres.En voici quelques-unes auxquelles je peux penser:
bindParam
, vous ne pouvez transmettre que des variables; pas des valeursbindValue
, vous pouvez passer les deux (valeurs, évidemment, et variables)bindParam
ne fonctionne qu'avec des variables car il permet de donner des paramètres en entrée / sortie, par "référence" (et une valeur n'est pas une "référence" valide en PHP) : elle est utile avec les drivers qui (en citant le manuel):Avec certains moteurs de base de données, les procédures stockées peuvent avoir des paramètres qui peuvent être utilisés à la fois pour l'entrée (donnant une valeur de PHP à la procédure) et pour la sortie (retournant une valeur du proc stocké à PHP); pour lier ces paramètres, vous devez utiliser bindParam et non bindValue.
la source
À partir des instructions préparées et des procédures stockées
Utilisez
bindParam
pour insérer plusieurs lignes avec une liaison unique:la source
Pour le but le plus courant, vous devez utiliser
bindValue
.bindParam
a deux comportements délicats ou inattendus:bindParam(':foo', 4, PDO::PARAM_INT)
ne fonctionne pas, car il nécessite de passer une variable (comme référence).bindParam(':foo', $value, PDO::PARAM_INT)
changera$value
en chaîne après l'exécutionexecute()
. Bien sûr, cela peut conduire à des bogues subtils qui pourraient être difficiles à détecter.Source: http://php.net/manual/en/pdostatement.bindparam.php#94711
la source
Vous n'avez plus à vous battre, quand il existe un moyen de le faire:
la source
La façon la plus simple de mettre cela en perspective pour la mémorisation par comportement (en termes de PHP):
bindParam:
référencebindValue:
variablela source