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?
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.
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
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