57 votes

PDO bindParam vs. exécuter

Je vois souvent du code utilisant bindParam ou bindValue avec PDO. Est-ce que simplement passer des arguments à execute est mal vu pour une raison quelconque?

Je comprends que bindParam lie effectivement les variables et que vous pouvez définir le type de paramètre lié avec les deux méthodes bind, mais que se passe-t-il si vous n'insérez que des chaînes de caractères?

$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');

Je vois souvent ce qui précède, mais personnellement je préfère:

$pdo->execute(array(':col2' => 'col2', ':col3' => 'col3', ':col4' => 'col4'));

Cela n'est pas aussi verbeux et visuellement, il me semble plus logique d'avoir les entrées "entrant" dans la requête ensemble. Cependant, je le vois rarement utilisé.

Y a-t-il une raison de préférer les méthodes bind au passage de paramètres à execute lorsque vous n'avez pas besoin de profiter des comportements spéciaux des premiers?

1 votes

Je pense que c'est une question de préférence - j'ai tendance à préférer utiliser bindValue et bindParam car je trouve que le code obtenu est plus facile à lire.

2 votes

C'est en effet une question de préférence. Si vous n'avez pas besoin de la possibilité de forcer des types (quand vous n'utilisez que des chaînes de caractères), passer un tableau à execute() est rapide et pratique.

66voto

Mike Brant Points 39322

Vous pourriez trouver bindParam utilisé lorsque vous voulez simplement lier une référence de variable à un paramètre dans la requête, mais peut-être devez encore effectuer certaines manipulations dessus et ne souhaitez que la valeur de la variable calculée au moment de l'exécution de la requête. Cela vous permet également de faire des choses plus complexes comme lier un paramètre à un appel de procédure stockée et avoir la valeur retournée mise à jour dans la variable liée.

Pour en savoir plus, consultez la documentation de bindParam, la documentation de bindValue et la documentation de execute.

Par exemple

$col1 = 'some_value';
$pdo->bindParam(':col1', $col1);
$col1 = 'some_other_value';
$pdo->execute(); // utiliserait 'some_other_value' pour le paramètre ':col1'

bindValue et le passage d'un tableau à execute se comportent de la même manière, car la valeur du paramètre est fixée à ce moment-là et le SQL est exécuté en conséquence.

En suivant le même exemple ci-dessus, mais en utilisant bindValue

$col1 = 'some_value';
$pdo->bindValue(':col1', $col1);
$col1 = 'some_other_value';
$pdo->execute(); // utiliserait 'some_value' pour le paramètre ':col1'

Lorsque vous passez des valeurs directement dans execute, toutes les valeurs sont traitées comme des chaînes de caractères (même si une valeur entière est fournie). Donc, si vous avez besoin d'imposer des types de données, vous devriez toujours utiliser bindValue ou bindParam.

Je pense que vous pourriez voir bind* utilisé plus souvent que execute(array), car beaucoup considèrent qu'il est préférable de définir explicitement les types de données dans les déclarations de paramètres.

0 votes

Salut, Mike. Par curiosité, pourrais-tu élaborer là-dessus? Ça m'a toujours intrigué la façon dont le passage de variables à bindParam() fonctionne, car parfois j'obtiens des erreurs "Impossible de passer une variable par référence", sans réellement comprendre ce que ça signifie quand j'y pense.

0 votes

@MartinBean J'ai mis à jour ma réponse pour inclure un exemple de la manière dont bindParam évaluerait la valeur de la variable liée au moment de l'exécution de la requête.

0 votes

Comment l'utilisation de execute n'est-elle pas explicite dans les déclarations de paramètres?

9voto

Jens Kooij Points 51

En passant les paramètres avec la méthode $pdo->execute(), toutes les valeurs dans le tableau seront passées, en tant que PDO::PARAM_STR à l'instruction avec la fonction $pdo->bindParam().

La principale différence que je peux voir maintenant, c'est qu'avec la fonction $pdo->bindParam(), vous pouvez définir le type de données passées, en utilisant les constantes PDO::PARAM_* telles que décrites dans le manuel de PHP.net

4voto

Teerath Kumar Points 285

Simple, la valeur de bindParam peut changer mais la valeur de bindValue ne peut pas changer. Exemple:

$someVal=10;
$someVal2=20;
/* Dans bindParam, l'argument de valeur n'est pas lié et 
sera modifié si nous changeons sa valeur avant l'exécution.
*/
$ref->bindParam(':someCol',$someVal);
$someVal=$someVal2;
$ref->execute();
//someCol=20
/* Dans bindValue, l'argument de valeur est lié et 
ne sera jamais modifié si nous changeons sa valeur avant l'exécution.
*/
$ref->bindValue(':someCol',$someVal);
// ici l'assignation est par référence (&$someVal)
$someVal=$someVal2;
$ref->execute();
//someCol=10

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