AOP bindParam vs exécuter
Je vois souvent des code à l'aide de bindParam
ou bindValue
avec PDO. Est tout simplement le passage d'arguments à execute
mal vu pour une raison quelconque?
Je comprends que bindParam
effectivement se lie à l'variables et que vous pouvez définir le type de paramètre d'être lié avec les deux bind
méthodes, mais que faire si vous n'insérez des cordes?
$query = "SELECT col1 FROM t1 WHERE col2 = :col2 AND col3 = :col3 AND col4 = :col4";
$pdo->bindValue(':col2', 'col2');
$pdo->bindValue(':col3', 'col3');
$pdo->bindValue(':col4', 'col4');
J'ai souvent voir ci-dessus, mais personnellement je préfère:
$pdo->execute(array(':col2' => 'col2', ':col3' => 'col3', ':col4' => 'col4'));
Il n'est pas aussi détaillé et visuellement il fait plus de sens pour moi d'avoir les entrées "va dans" à la requête. Cependant, je n'ai pratiquement jamais le voir utilisé.
Est-il une raison pour préférer la bind
méthodes plus le passage de paramètres à execute
lorsque vous n'avez pas à profiter de comportements de l'ancien?
- Je pense que c'est une question de préférence - j'ai tendance à préférer l'aide de
bindValue
etbindParam
parce que je pense que le code résultant est plus facile à lire. - C'est en effet en baisse de préférence. Si vous n'avez pas besoin de la capacité fo types de forces (lorsque vous êtes seulement en utilisant des chaînes de caractères), le passage d'un tableau à execute() est rapide et pratique.
Vous devez vous connecter pour publier un commentaire.
Vous pourriez trouver
bindParam
utilisé quand vous voulez juste pour lier une variable de référence à un paramètre dans la requête, mais peut-être encore besoin de faire quelques manipulations sur elle et que vous souhaitez uniquement la valeur de la variable calculée au moment de l'exécution de la requête. Il vous permet aussi de faire des choses plus complexes comme lier un paramètre à un appel de procédure stockée et ont la valeur retournée mis à jour dans la variable liée.Pour en savoir plus, voir la bindParam documentation, bindValue documentation et exécuter la documentation.
Par exemple
bindValue
et le passage d'un tableau àexecute
se comportent de la même manière que la valeur du paramètre est fixe sur ce point et SQL exécuté en conséquence.En suivant le même exemple ci-dessus, mais en utilisant
bindValue
Lors de la transmission de valeurs directement dans
execute
toutes les valeurs sont traitées comme des chaînes de caractères (même si le nombre entier valeur est fournie). Donc, si vous devez appliquer des types de données, vous devez toujours utiliserbindValue
oubindParam
.Je pense que vous pourriez voir
bind*
utilisé plus deexecute(array)
que beaucoup le considèrent comme une meilleure pratique de codage, de définir explicitement les types de données dans les déclarations de paramètres.bindParam()
œuvres, comme j'ai parfois l' "Ne peut pas passer une variable par référence" des erreurs, et pas vraiment sûr de ce que cela signifie pourquoi je pense à ce sujet.bindParam
permettrait d'évaluer la valeur de la variable liée à l'exécution de la requête du temps.execute
pas explicite dans les déclarations de paramètres?execute
la plupart du temps, personnellement.En passant les paramètres avec la
$pdo->execute()
méthode, toutes les valeurs dans le tableau avec le passé, commePDO::PARAM_STR
à la déclaration de la$pdo->bindParam()
fonction.La principale différence que je peux voir, c'est que maintenant avec le
$pdo->bindParam()
fonction, vous pouvez définir le type de données transmis le long, en utilisant lePDO::PARAM_*
constantes comme décrit dans la PHP.net manuelSimple,
la valeur de bindParam peuvent changer, mais la valeur de bindValue ne pouvez pas changer.
Exemple: