Question

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

Était-ce utile?

La solution

La réponse est dans la documentation bindParam :

  

Contrairement PDOStatement :: bindValue (), la variable est liée comme référence et ne sera évalué au moment où PDOStatement :: execute () est appelée.

execute

  

appeler PDOStatement :: bindParam () pour lier les variables PHP aux marqueurs de paramètres: 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

Exemple:

$value = 'foo';
$s = $dbh->prepare('SELECT name FROM bar WHERE baz = :baz');
$s->bindParam(':baz', $value); // use bindParam to bind the variable
$value = 'foobarbaz';
$s->execute(); // executed with WHERE baz = 'foobarbaz'

ou

$value = 'foo';
$s = $dbh->prepare('SELECT name FROM bar WHERE baz = :baz');
$s->bindValue(':baz', $value); // use bindValue to bind the variable's value
$value = 'foobarbaz';
$s->execute(); // executed with WHERE baz = 'foo'

Autres conseils

De l'entrée manuelle pour PDOStatement::bindParam :

  

[Avec bindParam] Contrairement à PDOStatement::bindValue(), la variable est liée en tant que référence et ne sera évaluée 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, je peux penser à:

  • Avec bindParam, vous ne pouvez passer des variables; pas des valeurs
  • avec bindValue, vous pouvez passer à la fois (valeurs, évidemment, et les variables)
  • bindParam fonctionne uniquement avec des variables car il permet des paramètres à être donnés en entrée / sortie, par « référence » (et une valeur n'est pas une « référence » valide en PHP) : il est utile avec pilotes (citant le manuel):
  

soutenir l'invocation de l'information stockée   procédures qui renvoient des données en sortie   paramètres, et certains également   paramètres d'entrée / sorties qui sont envoyés   dans les données sont mises à jour et de le recevoir.

Avec certains moteurs DB, procédures stockées peuvent avoir des paramètres qui peuvent être utilisés pour l'entrée (ce qui donne une valeur de PHP à la procédure) et sortie (retournant une valeur dans la procédure stockée à PHP); pour lier ces paramètres, vous devez utiliser bindParam, et non bindValue.

De déclarations préparées et procédures stockées

Utilisation bindParam pour insérer plusieurs lignes avec une temps de liaison:

<?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();

Aux fins 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 faut passer une variable (comme référence).
  • bindParam(':foo', $value, PDO::PARAM_INT) changera $value à la chaîne après l'exécution execute(). Ceci, bien sûr, peut conduire à des bugs subtils qui pourraient être difficiles à attraper.

Source: http://php.net/manual/en/pdostatement.bindparam.php#94711

Vous ne devez pas lutter plus longtemps, quand il existe une façon comme ceci:

$stmt = $pdo->prepare("SELECT * FROM someTable WHERE col = :val");
$stmt->execute([":val" => $bind]); 

La façon la plus simple de mettre cela en perspective pour la mémorisation par le comportement (en termes de PHP):

  • bindParam: référence
  • bindValue: variable
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top