139 votes

En PHP avec la fonction PDO, comment faire pour vérifier la requête finale de paramétrée SQL ?

En PHP, si vous accédez à la base de données MySQL avec PDO avec requête paramétrée, comment pouvez-vous vérifier la requête finale (après avoir remplacé tous les jetons) ?

Y a-t-il un moyen de vérifier ce qui est vraiment exécuté par la base de données ?

55voto

JB Hurteaux Points 1191

Donc, je pense que je vais enfin répondre à ma propre question afin d'avoir une solution complète pour l'enregistrement. Mais ont à remercier Ben James et Kailash Badu qui a fourni les indices pour cette.

Réponse Courte
Comme mentionné par Ben James: AUCUN.
L'ensemble de la requête SQL n'existe pas sur le PHP côté, parce que la requête avec les jetons et les paramètres sont envoyés séparément à la base de données. Seulement sur le côté de la base de données de la requête complète existe.

Même en essayant de créer une fonction pour remplacer les jetons sur le PHP n'allait pas garantir le processus de remplacement est le même que le SQL un (choses difficiles comme jeton de type, bindValue vs bindParam, ...)

Solution de contournement
C'est là que j'élabore sur Kailash Badu réponse. En vous connectant toutes les requêtes SQL, nous pouvons voir ce qui est réellement exécuté sur le serveur. Avec mySQL, ce qui peut être fait par la mise à jour de la ma.cnf (ou mon.ini dans mon cas avec Wamp server), et en ajoutant une ligne comme:

log=[REPLACE_BY_PATH]/[REPLACE_BY_FILE_NAME]

Il suffit de ne pas exécuter ce dans de production!!!

27voto

Ben James Points 41165

En utilisant des requêtes préparées avec paramétrés valeurs n'est pas simplement une autre façon de créer dynamiquement une chaîne de SQL. Vous créez une déclaration préparée à la base de données, puis d'envoyer les valeurs de paramètre seul.

Donc, ce qui est probablement envoyés à la base de données sera un PREPARE ..., alors SET ... et, enfin, EXECUTE ....

Vous ne serez pas en mesure de se faire une chaîne SQL comme SELECT * FROM ..., même si elle permettrait de produire des résultats équivalents, parce qu'aucune requête n'a jamais été réellement envoyé à la base de données.

26voto

Michael Points 121

Vous pourriez être en mesure d’utiliser `` . Consultez la documentation de PHP .

9voto

Kailash Badu Points 186

Je vérifie le journal des requêtes pour afficher la requête exacte qui a été exécutée comme l’instruction préparée.

5voto

Laptop Lifts Points 136

J'ai d'abord éviter l'activation de la journalisation pour surveiller AOP parce que je pensais que ce serait un tracas, mais il n'est pas difficile du tout. Vous n'avez pas besoin de redémarrer MySQL (après 5.1.9):

L'exécution de cette SQL dans phpMyAdmin ou dans tout autre environnement où vous pouvez avoir élevé db privilèges:

SET GLOBAL general_log = 'ON';

Dans un terminal, la queue de votre fichier de log. La mienne est ici:

>sudo tail -f /usr/local/mysql/data/myMacComputerName.log

Vous pouvez rechercher votre mysql fichiers avec ce terminal de commande:

>ps auxww|grep [m]ysqld

J'ai trouvé que PDO échappe à tout, de sorte que vous ne pouvez pas écrire

$dynamicField = 'userName';
$sql = "SELECT * FROM `example` WHERE `:field` = :value";
$this->statement = $this->db->prepare($sql);
$this->statement->bindValue(':field', $dynamicField);
$this->statement->bindValue(':value', 'mick');
$this->statement->execute();

Parce qu'il crée:

SELECT * FROM `example` WHERE `'userName'` = 'mick' ;

Qui ne créent pas une erreur, juste un résultat vide. Au lieu de cela j'avais besoin d'utiliser

$sql = "SELECT * FROM `example` WHERE `$dynamicField` = :value";

pour obtenir

SELECT * FROM `example` WHERE `userName` = 'mick' ;

Lorsque vous avez terminé de s'exécuter:

SET GLOBAL general_log = 'OFF';

ou bien vos journaux aurez une énorme.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X