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 ...)

  1. 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?
  2. Comment ça marche en vrai? Est-il substituer un espace réservé avec des données ou non?
  3. 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(?,?)'

Était-ce utile?

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.

  1. 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.

  2. 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.

  3. 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.

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