Quelle est la différence entre bindParam et bindValue?

Quelle est la différence entre PDOStatement::bindParam() et PDOStatement::bindValue()?

342
demandé sur Adrian Cid Almaguer 2009-07-25 00:00:58

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

168
répondu acrosman 2013-10-19 18:44:53

À 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'
624
répondu lonesomeday 2011-02-22 10:48:22

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.

207
répondu Pascal MARTIN 2009-07-24 20:12:36

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

23
répondu Denilson Sá Maia 2014-07-10 21:03:06

À 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();
19
répondu Nezar Fadle 2016-03-10 06:16:20

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]); 
1
répondu Thielicious 2017-07-27 22:49:58

La façon la plus simple de le mettre (en termes de PHP):

  • bindParam: référence
  • bindValue: la variable
1
répondu tfont 2018-07-04 15:39:58

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.

-1
répondu Crayons 2018-03-30 13:10:08