Avant de passer à PDO, j'ai créé des requêtes SQL en PHP en concaténant des chaînes. Si j'ai une erreur de syntaxe de base de données, je pourrais simplement faire écho à la chaîne de requête SQL finale, l'essayer moi-même dans la base de données et la modifier jusqu'à ce que je corrige l'erreur, puis la remettre dans le code.
Les instructions PDO préparées sont plus rapides, meilleures et plus sûres, mais une chose me dérange: je ne vois jamais la requête finale telle qu'elle est envoyée à la base de données. Lorsque j'obtiens des erreurs sur la syntaxe dans mon journal Apache ou mon fichier journal personnalisé (je consigne les erreurs dans un catch
bloc), je ne peux pas voir la requête qui les a provoquées.
Existe-t-il un moyen de capturer la requête SQL complète envoyée par PDO dans la base de données et de la consigner dans un fichier?
/var/log/mysql/*
. Les paramètres liés à PDO ne peuvent pas provoquer d'erreurs de syntaxe, il vous suffit donc de la requête SQL préparée.var_dump($pdo_instance->debugDumpParams())
Réponses:
Tu dis ça :
Eh bien, en fait, lorsque vous utilisez des instructions préparées, il n'y a pas de " requête finale " :
Donc, pour répondre à votre question :
Non: comme il n'y a aucune " requête SQL complète " nulle part, il n'y a aucun moyen de la capturer.
La meilleure chose que vous puissiez faire, à des fins de débogage, est de «reconstruire» une «vraie» requête SQL, en injectant les valeurs dans la chaîne SQL de l'instruction.
Ce que je fais habituellement, dans ce genre de situations, c'est:
var_dump
(ou un équivalent) juste après, pour afficher les valeurs des paramètresCe n'est pas génial, quand il s'agit de débogage - mais c'est le prix des instructions préparées et les avantages qu'elles apportent.
la source
Recherche dans le journal de la base de données
Bien que Pascal MARTIN ait raison de dire que PDO n'envoie pas la requête complète à la base de données en une seule fois, la suggestion de ryeguy d'utiliser la fonction de journalisation de la base de données m'a en fait permis de voir la requête complète assemblée et exécutée par la base de données.
Voici comment: (Ces instructions concernent MySQL sur une machine Windows - votre kilométrage peut varier)
my.ini
, sous la[mysqld]
section, ajoutez unelog
commande, commelog="C:\Program Files\MySQL\MySQL Server 5.1\data\mysql.log"
Ce fichier augmentera rapidement, alors assurez-vous de le supprimer et de désactiver la journalisation lorsque vous avez terminé les tests.
la source
PDO::ATTR_EMULATE_PREPARES
. Voir cette réponse pour plus d'informations: stackoverflow.com/questions/10658865/#answer-10658929general_log
au lieu delog
. Voir dev.mysql.com/doc/refman/5.5/en/query-log.htmlBien sûr, vous pouvez déboguer en utilisant ce mode.
{{ PDO::ATTR_ERRMODE }}
Ajoutez simplement une nouvelle ligne avant votre requête, puis vous afficherez les lignes de débogage.la source
->query
lorsque vous utilisez des instructions préparées?Ce que vous voulez probablement faire est d'utiliser debugDumpParams () sur le descripteur de l'instruction. Vous pouvez l'exécuter à tout moment après la liaison des valeurs à la requête préparée (pas besoin de
execute()
l'instruction).Il ne construit pas l'instruction préparée pour vous, mais il affichera vos paramètres.
la source
Un ancien message mais peut-être que quelqu'un trouvera cela utile;
la source
Voici une fonction pour voir quel sera le SQL effectif, adapté d'un commentaire de "Mark" sur php.net :
la source
str_replace(":$k" ....
? Les index associatifs l'ont déjà dans le tableau $ params.:name_long
par:name
. Au moins si:name
vient avant:name_long
. Les instructions préparées par MySQL peuvent gérer cela correctement, alors ne vous laissez pas embrouiller.Non. Les requêtes PDO ne sont pas préparées côté client. PDO envoie simplement la requête SQL et les paramètres au serveur de base de données. La base de données est ce que fait la substitution (des
?
's). Vous avez deux options:la source
presque rien n'a été dit sur l'affichage des erreurs sauf vérifier les journaux d'erreurs, mais il existe une fonctionnalité plutôt utile:
( lien source )
il est clair que ce code peut être modifié pour être utilisé comme message d'exception ou tout autre type de gestion d'erreur
la source
par exemple, vous avez cette instruction pdo:
maintenant vous pouvez obtenir la requête exécutée en définissant un tableau comme celui-ci:
la source
));
devrait être);
(un seul crochet rond).En cherchant sur Internet, j'ai trouvé cela comme une solution acceptable. Une classe différente est utilisée à la place des PDO et les fonctions PDO sont appelées via des appels de fonctions magiques. Je ne suis pas sûr que cela crée de sérieux problèmes de performances. Mais il peut être utilisé jusqu'à ce qu'une fonction de journalisation sensible soit ajoutée à PDO.
Ainsi, selon ce fil , vous pouvez écrire un wrapper pour votre connexion PDO qui peut enregistrer et lancer une exception lorsque vous obtenez une erreur.
Voici un exemple simple:
vous pouvez donc utiliser cette classe au lieu de PDOStatement:
Voici une implémentation de décorateur PDO mentionnée:
la source
Pour connecter MySQL dans WAMP , vous devrez éditer le my.ini (par exemple sous wamp \ bin \ mysql \ mysql5.6.17 \ my.ini)
et ajouter à
[mysqld]
:la source
Voici une fonction que j'ai créée pour renvoyer une requête SQL avec des paramètres "résolus".
En supposant que vous exécutez comme ça
Cette fonction n'ajoute PAS de guillemets aux requêtes mais fait le travail pour moi.
la source
if (is_string($value)) { $value = "'".$value."'"; }
Le problème que j'ai eu avec la solution pour attraper les exemptions PDO à des fins de débogage est qu'elle n'a attrapé que les exemptions PDO (duh), mais n'a pas attrapé les erreurs de syntaxe qui ont été enregistrées comme des erreurs php (je ne sais pas pourquoi, mais " pourquoi "est sans rapport avec la solution). Tous mes appels PDO proviennent d'une seule classe de modèle de table que j'ai étendue pour toutes mes interactions avec toutes les tables ... cela compliquait les choses lorsque j'essayais de déboguer du code, car l'erreur enregistrerait la ligne de code php où mon appel d'exécution était appelé, mais ne m'a pas dit d'où l'appel était en fait. J'ai utilisé le code suivant pour résoudre ce problème:
Ainsi, le code ci-dessus détecte À LA FOIS les exceptions PDO ET les erreurs de syntaxe php et les traite de la même manière. Mon gestionnaire d'erreurs ressemble à ceci:
Si quelqu'un a de meilleures idées sur la façon d'obtenir des informations pertinentes pour mon gestionnaire d'erreurs que de définir le modèle de table en tant que variable globale, je serais heureux de l'entendre et de modifier mon code.
la source
ce code fonctionne très bien pour moi:
N'oubliez pas de remplacer $ data et $ query par vos noms
la source
j'utilise cette classe pour déboguer PDO (avec Log4PHP )
la source
J'ai créé un projet / référentiel moderne chargé par Composer pour exactement cela ici:
pdo-debug
Trouvez la page d' accueil GitHub du projet ici , voir un article de blog l'expliquant ici . Une ligne à ajouter dans votre composer.json, puis vous pouvez l'utiliser comme ceci:
$ sql est l'instruction SQL brute, $ parameters est un tableau de vos paramètres: la clé est le nom de l'espace réservé (": user_id") ou le numéro du paramètre sans nom ("?"), la valeur est .. eh bien, le valeur.
La logique derrière: Ce script gradera simplement les paramètres et les remplacera dans la chaîne SQL fournie. Super simple, mais super efficace pour 99% de vos cas d'utilisation. Remarque: Ceci est juste une émulation de base, pas un vrai débogage PDO (car cela n'est pas possible car PHP envoie du SQL brut et des paramètres au serveur MySQL séparés).
Un grand merci à bigwebguy et Mike du thread StackOverflow Obtenir la chaîne de requête SQL brute de PDO pour avoir écrit essentiellement la fonction principale derrière ce script. Dédicace!
la source
Comment déboguer les requêtes de base de données PDO mysql dans Ubuntu
TL; DR Enregistrez toutes vos requêtes et suivez le journal mysql.
Ces instructions concernent mon installation d'Ubuntu 14.04. Émettez la commande
lsb_release -a
pour obtenir votre version. Votre installation peut être différente.Activer la connexion dans mysql
cd /etc/mysql
. Vous devriez voir un fichier appelémy.cnf
. C'est le fichier que nous allons changer.cat my.cnf | grep general_log
. Cela filtre lemy.cnf
fichier pour vous. Vous devriez voir deux entrées:#general_log_file = /var/log/mysql/mysql.log
&&#general_log = 1
.sudo service mysql restart
.sudo service nginx restart
.Bon travail! Vous êtes prêt. Il ne vous reste plus qu'à terminer le fichier journal afin de voir les requêtes PDO effectuées par votre application en temps réel.
Tail le journal pour voir vos requêtes
Entrez cette cmd
tail -f /var/log/mysql/mysql.log
.Votre sortie ressemblera à ceci:
Toute nouvelle requête effectuée par votre application apparaîtra automatiquement , tant que vous continuerez à suivre le journal. Pour sortir de la queue, frappez
cmd/ctrl c
.Remarques
truncate --size 0 mysql.log
.Crédit et merci
Grand cri à la réponse de Nathan Long ci-dessus pour l'inspiration de comprendre cela sur Ubuntu. Aussi à dikirill pour son commentaire sur le post de Nathan qui m'a conduit à cette solution.
Je t'aime stackoverflow!
la source
Dans l'environnement Debian NGINX, j'ai fait ce qui suit.
Allez
/etc/mysql/mysql.conf.d
modifiermysqld.cnf
si vous trouvez,log-error = /var/log/mysql/error.log
ajoutez les 2 lignes suivantes ci-dessous.Pour voir les journaux, allez
/var/log/mysql
ettail -f mysql.log
N'oubliez pas de commenter ces lignes une fois que vous avez terminé le débogage si vous êtes dans un environnement de production, supprimez
mysql.log
car ce fichier journal augmentera rapidement et peut être énorme.la source