Quelle est la différence entre bindParam et bindValue?
Quelle est la différence entre PDOStatement::bindParam()
et PDOStatement::bindValue()
?
8 réponses
La réponse est dans la documentation de bindParam
:
Contrairement à PDOStatement::bindValue (), la variable est liée comme référence et ne sera évaluée qu'au moment où PDOStatement::execute() est appelé.
Et execute
Appelez PDOStatement:: bindParam () pour lier les variables PHP aux marqueurs de paramètres: les variables liées passent leur valeur en entrée et reçoivent la valeur de sortie, le cas échéant, de leurs marqueurs de paramètres associés
À Partir de l'entrée de manuel pour PDOStatement::bindParam
:
[avec
bindParam
] contrairement àPDOStatement::bindValue()
, la variable est liée comme référence et ne sera évaluée qu'au moment oùPDOStatement::execute()
est appelé.
Ainsi, par exemple:
$sex = 'male';
$s = $dbh->prepare('SELECT name FROM students WHERE sex = :sex');
$s->bindParam(':sex', $sex); // use bindParam to bind the variable
$sex = 'female';
$s->execute(); // executed with WHERE sex = 'female'
Ou
$sex = 'male';
$s = $dbh->prepare('SELECT name FROM students WHERE sex = :sex');
$s->bindValue(':sex', $sex); // use bindValue to bind the variable's value
$sex = 'female';
$s->execute(); // executed with WHERE sex = 'male'
Voici quelques-uns que je peux penser:
- avec
bindParam
, Vous ne pouvez passer que des variables; pas des 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) : c'est utile avec les pilotes (citant le manuel) :
Prend en charge l'appel de stocké les procédures renvoyer les données en sortie paramètres, et certains aussi paramètres d'entrée / sortie que les deux envoient dans les données et sont mis à jour pour le recevoir.
Avec certains moteurs DB, les procédures stockées peuvent avoir des paramètres qui peuvent être utilisés à la fois pour l'entrée (donnant une valeur de PHP à la procédure) et ouput (renvoyant une valeur du proc stocké à PHP) ; pour lier ces paramètres, vous devez utiliser bindParam, et non bindValue.
Dans le but le plus courant, vous devez utiliser bindValue
.
bindParam
a deux comportements difficiles ou inattendus:
-
bindParam(':foo', 4, PDO::PARAM_INT)
ne fonctionne pas, car il nécessite de passer une variable (comme référence). -
{[3] } changera
$value
en chaîne après avoir exécutéexecute()
. Ceci, bien sûr, peut conduire à des bogues qui pourraient être difficiles à attraper.
Source: http://php.net/manual/en/pdostatement.bindparam.php#94711
À partir de instructions préparées et procédures stockées
Utilisez bindParam
pour insérer plusieurs lignes avec une liaison unique:
<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);
// insert one row
$name = 'one';
$value = 1;
$stmt->execute();
// insert another row with different values
$name = 'two';
$value = 2;
$stmt->execute();
Vous n'avez pas à lutter plus longtemps, lorsqu'il existe un moyen lilke ceci:
$stmt = $pdo->prepare("SELECT * FROM someTable WHERE col = :val");
$stmt->execute([":val" => $bind]);
La façon la plus simple de le mettre (en termes de PHP):
-
bindParam:
référence -
bindValue:
la variable
La différence clé entre les deux méthodes, qui peut être lue à partir de la documentation de bindParam(), est la manière dont la variable de paramètre est transmise dans l'appel de procédure.
La méthode bindParam () liera le marqueur de paramètre au nom de la variable PHP qui contiendra la valeur de sortie, pas la valeur elle-même. De plus, sa valeur n'est évaluée qu'au moment où PDOStatement::execute() est appelé.
... la variable est liée comme référence et ne sera évaluée qu'au moment où PDOStatement::execute() est appelé.
Par comparaison, la méthode bindvalue() liera le marqueur de paramètre à la valeur de la variable PHP son référencement, et est donc immédiatement disponible au moment où PDOStatement::execute() est appelé.
Il est important de noter lors de l'utilisation de la méthode bindParam (), si votre paramètre est un paramètre OUT, ce qui signifie qu'il se lie à une variable qui obtient sa valeur à partir d'une procédure stockée, alors vous devez définissez explicitement la longueur comme indiqué dans la documentation du paramètre length :
Longueur
Longueur du type de données. Pour indiquer qu'un paramètre est un paramètre OUT d'une procédure stockée, vous devez définir explicitement la longueur.
Vous devez définir la longueur du paramètre de sortie pour correspondre à la longueur maximale attendue telle que définie dans votre base de données.