web-dev-qa-db-fra.com

PDO bindParam vs execute

Je vois souvent du code utilisant bindParam ou bindValue avec PDO. Le fait de simplement passer des arguments à execute est-il mal vu pour une raison quelconque?

Je comprends que bindParam se lie en fait aux variables et que vous pouvez définir le type de paramètre lié avec les deux méthodes bind, mais que faire si vous insérez uniquement des chaînes?

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

Ce n'est pas aussi verbeux et visuellement, il est plus logique pour moi d'avoir les entrées "entrant" ensemble dans la requête. Cependant, je ne le vois presque jamais utilisé.

Y a-t-il une raison de préférer les méthodes bind plutôt que de passer des paramètres à execute lorsque vous n'avez pas à profiter des comportements spéciaux de la première?

54
Explosion Pills

Vous pouvez trouver bindParam utilisé lorsque vous voulez simplement lier une référence de variable à un paramètre de la requête, mais peut-être avez-vous encore besoin de faire quelques manipulations dessus et ne voulez que la valeur de la variable calculée au moment de l'exécution de la requête . Il vous permet également de faire des choses plus complexes comme lier un paramètre à un appel de procédure stockée et de mettre à jour la valeur renvoyée dans la variable liée.

Pour plus d'informations, voir documentation bindParam , documentation bindValue et exécuter la documentation .

Par exemple

$col1 = 'some_value';
$pdo->bindParam(':col1', $col1);
$col1 = 'some_other_value';
$pdo->execute(); // would use 'some_other_value' for ':col1' parameter

bindValue et en passant un tableau à execute se comportent de la même manière que la valeur du paramètre est fixée à ce point et SQL 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(); // would use 'some_value' for ':col1' parameter

Lors du passage de valeurs directement dans execute toutes les valeurs sont traitées comme des chaînes (même si une valeur entière est fournie). Donc, si vous devez appliquer des types de données, vous devez toujours utiliser bindValue ou bindParam.

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

61
Mike Brant

En passant les paramètres avec la méthode $pdo->execute(), toutes les valeurs du tableau doivent être passées, comme 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 transmis, en utilisant les constantes PDO::PARAM_* comme décrit dans le manuel PHP.net

9
Jens Kooij

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

$someVal=10;
$someVal2=20;
/* In bindParam, the value argument is not bound and 
will be changed if we change its value before execute.
*/
$ref->bindParam(':someCol',$someVal);
$someVal=$someVal2;
$ref->execute();
//someCol=20
/* In bindValue, the value argument is bound and 
never changed if we change its value before execute.
*/
$ref->bindValue(':someCol',$someVal);
// here assignment is referral (&$someVal)
$someVal=$someVal2;
$ref->execute();
//someCol=10
4
Teerath Kumar