147 votes

Comment faire pour déboguer les requêtes de base de données PDO ?

Avant de passer à PDO, j'ai créé des requêtes SQL en PHP par la concaténation de chaînes. Si j'ai eu de la base de données erreur de syntaxe, j'ai juste l'écho de la dernière chaîne de requête SQL, l'essayer moi-même sur la base de données, et de le tordre jusqu'à ce que j'ai corrigé l'erreur, puis remettre tout ça dans le code.

Préparé AOP états sont plus rapides et de meilleure qualité et plus sûrs, mais une chose qui me dérange: je ne vois jamais la dernière question qu'elle est envoyée à la base de données. Quand j'ai des erreurs à propos de la syntaxe dans mon log d'Apache ou de mon fichier journal personnalisé (j'ai des erreurs dans le journal l'intérieur d'un catch de l'îlot), je ne peux pas voir la requête que leur avait causé.

Est-il un moyen de capturer la requête SQL complète envoyé par PDO à la base de données et l'enregistrer dans un fichier?

101voto

Pascal MARTIN Points 195780

Vous dites ceci :

Je n'ai jamais vu la requête finale comme c'est envoyé à la base de données

Eh bien, en fait, lors de l'utilisation de déclarations préparées à l'avance, il n'y a pas une telle chose comme une "dernière question" :

  • Tout d'abord, une déclaration est envoyée à la DB, et préparé
    • La base de données analyse la requête, et construit une représentation interne de l'il
  • Et, lorsque vous liez des variables et exécutez l'instruction, seules les variables sont envoyées à la base de données
    • Et la base de données "injecte" les valeurs dans sa représentation interne de l'énoncé


Donc, pour répondre à votre question :

Est-il un moyen de capturer la complète Requête SQL envoyée par PDO à la base de données et l'enregistrer dans un fichier?

Pas : comme il n'y a pas de "requête SQL complète" n'importe où, il n'y a aucun moyen de le capturer.


La meilleure chose que vous pouvez faire, à des fins de débogage, est "re-construire" un "réel" de la requête SQL, en injectant les valeurs dans la chaîne SQL de la déclaration.

Ce que je fais d'habitude, dans ce genre de situations, c'est :

  • echo le code SQL qui correspond à l'énoncé, avec des espaces réservés
  • et utiliser var_dump (ou un équivalent) juste après, pour afficher les valeurs des paramètres
  • C'est généralement suffisant pour voir l'erreur possible, même si vous n'avez pas de "réel" de la requête que vous pouvez exécuter.

Ce n'est pas grand, quand il s'agit de débogage, mais c'est le prix de déclarations préparées à l'avance et les avantages qu'ils apportent.

87voto

Nathan Long Points 30303

En regardant dans le journal de base de données

Bien que Pascal MARTIN est correct que PDO ne pas envoyer la requête complète de la base de données une fois pour toutes, ryeguyla suggestion de l'utilisation de la DB de la fonction de journalisation en fait m'a permis de voir l'intégralité de la requête comme assemblés et exécuté par la base de données.

Voici comment: (Ces instructions sont pour MySQL sur une machine Windows - votre kilométrage peut varier)

  • En my.ini, sous l' [mysqld] section, ajouter un log de commande, à l'instar log="C:\Program Files\MySQL\MySQL Server 5.1\data\mysql.log"
  • Le Redémarrage De MySQL.
  • Il va commencer à enregistrer toutes les requêtes dans ce fichier.

Ce fichier va croître rapidement, alors assurez-vous de le supprimer et désactiver la journalisation lorsque vous avez terminé le test.

21voto

fijiaaron Points 1064

Ce que vous voulez faire est sans doute pas utiliser debugdumparams() , qu'il n’est pas construire l’instruction préparée pour vous, mais il affiche vos paramètres.

13voto

dontaskagain Points 138

Un vieux post, mais peut-être quelqu'un trouveras ceci utile ;

8voto

ryeguy Points 24980

Lol Requêtes de l’AOP ne sont pas prêts sur le côté client. AOP envoie simplement la requête SQL et les paramètres sur le serveur de base de données. La base de données est ce que fait la substitution (de la `` de). Vous avez deux options :

  • Utilisez la fonction de journalisation de votre DB (mais même dans ce cas elle est normalement marquée deux déclarations séparées (à c’est à dire, « pas définitive ») au moins avec Postgres)
  • La requête SQL et les paramètres de sortie et de reconstituer ce vous-même

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