Question

Le PDOStatement :: bindValue () méthode offre un moyen de spécifier le type de variable liée:

PDOStatement :: bindValue (paramètre $, la valeur $ [, $ data_type = AOP :: PARAM_STR ])

Je me demande, quel est le but de spécifier le type de données, alors que lorsque leaved par défaut (PARAM_STR) éventuellement la base de données sera jeté de toute façon la valeur du type approprié avant de l'utiliser?

Par exemple, si vous avez ces requêtes sur un champ INTEGER:

INSERT INTO table (integerField) VALUES (?) ;
SELECT * FROM table WHERE integerField = ?  ;

Et vous liez un entier en PHP, PDO par défaut bind comme une chaîne, ce qui est équivalent:

INSERT INTO table (integerField) VALUES ("1") ;
SELECT * FROM table WHERE integerField = "1"  ;

Cela fonctionnera parfaitement, car la base de données SQL (au moins MySQL, je ne suis pas vraiment au courant de la façon dont cela pourrait fonctionner sur d'autres SGBDR) sait comment convertir le dos de chaîne en entier avant de l'utiliser.

Quels sont les cas d'utilisation où il ferait une différence de paramètres typés liés vs chaînes?

Était-ce utile?

La solution

Je ne suis pas AOP-expert, mais je ne peux penser à quelques scenarioes où le paramètre data_type est à la fois utile et même nécessaire.

Paramètres de sortie

Lorsque vous définissez les paramètres de sortie ou d'entrée / sortie, vous devez fournir à la fois le type et la longueur du paramètre de sortie prévu.

Ref: http://www.php.net/manual /en/pdo.prepared-statements.php

Exemple # 4

$stmt = $dbh->prepare("CALL sp_returns_string(?)");
$stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000); 

Exemple # 5

$stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)");
$value = 'hello';
$stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000); 

DBM sans coulée implicite

Expliqué dans une autre réponse à cette question ...

Lorsque le paramètre est pas lié aux données coulables

bases de données même avec des capacités de moulage ne sera pas toujours en mesure de vous jeter correctement variable.

Ref: taper fortement dans les paramètres PDO

$limit = 1;

$dbh->prepare("SELECT * FROM items LIMIT :limit");
$dbh->bindParam(":limit", $limit, PDO::PARAM_STR); 
// Will throw "You have an error in your SQL syntax..."

Autres conseils

C'est principalement pour interagir avec des bases de données qui nécessitent la saisie correcte. Par exemple, si vous activez le mode strict dans MySQL, vous obtenez des erreurs (requêtes) ont échoué au lieu d'avertissements quand il y a des discordances de type.

Par défaut, MySQL fait de son mieux pour convertir les données correctement. Mais si vous avez jamais vu dans un champ 0000-00-00 date, qui est très probablement le résultat de mysql essayer de convertir une chaîne à une date et à défaut. En mode strict, la requête ne permettrait pas au lieu d'essayer de convertir et d'utiliser quel que soit le résultat.

Le paramètre de type de données à PDOStatement :: bindValue () n'est pas très utile. Essentiellement:

  • Si vous le dites PDO :: PARAM_STR, il convertit votre valeur en une chaîne.
  • Si vous le dites PDO :: PARAM_INT et vous passez un booléen, il le convertit en un long.
  • Si vous le dites PDO :: PARAM_BOOL et vous passez un long, il le convertit en un booléen.

Rien ne semble d'autre à convertir. Voir un rapide coup d'oeil au code source et peu d'explications mieux. Peut-être le plus important, AOP ne lancera pas d'exception ou produire une erreur si vous passez des données avec un type qui ne correspond pas au type de données que vous avez passé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top