397 votes

AOP : bindParam contre bindValue

Quelle est la différence entre `` et `` ?

678voto

lonesomeday Points 95456

De la saisie manuelle pour `` :

[Par ] Contrairement à , la variable est liée comme référence et seront seulement évaluées au moment que `` est appelée.

Ainsi, par exemple :

ou

223voto

Pascal MARTIN Points 195780

Voici quelques je pense :

  • Avec bindParam, vous ne pouvez passer des variables ; non pas les valeurs
  • avec bindValue, vous pouvez passer les deux (valeurs, évidemment, et les variables)
  • bindParam fonctionne uniquement avec des variables, car elle permet des paramètres donnés en entrée/sortie, par "référence" (et une valeur n'est pas valide "référence" en PHP) : il est utile avec les pilotes (citant le manuel) :

le soutien de l'invocation de l'stockées les procédures de retour des données de sortie paramètres, et certains aussi d'entrée/sortie les paramètres à la fois d'envoyer dans les données et sont mises à jour pour la recevoir.

Avec certains moteurs de base de données, procédures stockées peuvent avoir des paramètres qui peuvent être utilisés aussi bien en entrée (ce qui donne une valeur à partir de PHP à la procédure) et de sortie (retour d'une valeur à partir de la procédure stockée à PHP) ; de lier ces paramètres, vous devez utiliser bindParam, et pas bindValue.

215voto

acrosman Points 7688

La réponse est dans la documentation pour l' bindParam:

Contrairement à la méthode PDOStatement::bindValue(), la variable est lié à titre de référence et ne seront évalués au moment de PDOStatement::execute() est appelée.

Et execute

appel de la méthode PDOStatement::bindParam() pour lier des variables PHP pour les marqueurs de paramètres: les variables liées à transmettre leur valeur d'entrée et de recevoir la valeur de sortie, le cas échéant, de leurs associés des marqueurs de paramètres

29voto

Denilson Sá Points 6953

Pour la plupart d'un but commun, vous devez utiliser bindValue.

bindParam a deux délicate ou des comportements inattendus:

  • bindParam(':foo', 4, PDO::PARAM_INT) ne fonctionne pas, car il nécessite le passage d'un variable (comme référence).
  • bindParam(':foo', $value, PDO::PARAM_INT) changera $value de la chaîne après l'exécution de l' execute(). Ceci, bien sûr, peut conduire à des bogues qui pourraient être difficiles à attraper.

Source: http://php.net/manual/en/pdostatement.bindparam.php#94711

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X