La façon dont fonctionne la requête paramétrés AOP
-
03-10-2019 - |
Question
LIRE LA QUESTION S'IL VOUS PLAÎT ATTENTIVEMENT. Il n'est pas stupide d'habitude « mon code ne fonctionne pas !!! » question.
Quand je lance ce code avec erreur prévue
try {
$sth = $dbh->prepare("SELECT id FROM users WHERE name INN(?,?) ");
$sth->execute(array("I'm","d'Artagnan"));
} catch (PDOException $e) {
echo $e->getMessage();
}
Je reçois ce message d'erreur
Vous avez une erreur dans votre syntaxe SQL ... près de 'INN (' I \ 'm', 'd \' Artagnan ')' à la ligne 1
Mais je pensais que depuis des années que la requête et les données envoyées au serveur séparément et ne jamais interférer. J'ai donc quelques questions (bien que je doute que quelqu'un a une réponse ...)
- Où est-il obtenir une telle représentation de chaîne familière - cité et a échappé? Est-elle fait surtout signaler une erreur ou une partie de la requête réelle?
- Comment ça marche en vrai? Est-il substituer un espace réservé avec des données ou non?
- Est-il possible d'obtenir requête ensemble, non seulement peu de celui-ci, à des fins de débogage?
Mise à jour
mysqli
ne comme prévu: il renvoie une erreur dit near 'INN(?,?)'
La solution
essayez d'ajouter
$dbh->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );
;)
Autres conseils
Je ne suis pas sûr de tous les détails, mais je vais essayer de répondre.
-
La citation se passe sur le côté de la base de données. La base de données échappe et assainit toutes les valeurs (voir point 2), il reçoit pour qu'il soit interprété correctement. Le moment où l'erreur est renvoyée, la base de données (MySQL dans ce cas) imprime la requête qu'il a essayé de courir. Ce ne serait pas si utile si elle vient de montrer la partie préparée.
-
Non, il ne fonctionne pas. Au moment de la préparation de la requête est compilée sur le côté serveur. Lorsqu'une requête est exécutée avec des valeurs, seules les valeurs sont transmises. Ceci est à peu près la même chose que d'appeler PREPARE et EXECUTE sur la base de données directement.
-
Cela dépend de la base de données que vous utilisez. MySQL par exemple, peut enregistrer toutes les requêtes dans un fichier journal (vérifiez my.cnf paramètres pour cela). Mais vous pouvez aussi utiliser debugDumpParams () sur le côté PHP.
J'espère que cela était un peu utile.