Vor dem Wechsel zu PDO habe ich SQL-Abfragen in PHP durch Verketten von Zeichenfolgen erstellt. Wenn ich einen Datenbanksyntaxfehler habe, kann ich einfach die endgültige SQL-Abfragezeichenfolge wiederholen, sie selbst in der Datenbank ausprobieren und optimieren, bis ich den Fehler behoben habe, und diese dann wieder in den Code einfügen.
Vorbereitete PDO-Anweisungen sind schneller und besser und sicherer, aber eines stört mich: Ich sehe die endgültige Abfrage nie, wenn sie an die Datenbank gesendet wird. Wenn ich Fehler bezüglich der Syntax in meinem Apache-Protokoll oder meiner benutzerdefinierten Protokolldatei erhalte (ich protokolliere Fehler innerhalb eines catch
Blocks), kann ich die Abfrage, die sie verursacht hat, nicht sehen.
Gibt es eine Möglichkeit, die vollständige SQL-Abfrage zu erfassen, die vom PDO an die Datenbank gesendet und in einer Datei protokolliert wird?
/var/log/mysql/*
. PDO-gebundene Parameter können keine Syntaxfehler verursachen. Sie benötigen daher nur die vorbereitete SQL-Abfrage.var_dump($pdo_instance->debugDumpParams())
Antworten:
Du sagst das :
Nun, tatsächlich gibt es bei Verwendung vorbereiteter Anweisungen keine " endgültige Abfrage " :
Um Ihre Frage zu beantworten:
Nein: Da es nirgendwo eine " vollständige SQL-Abfrage " gibt, gibt es keine Möglichkeit, diese zu erfassen.
Das Beste, was Sie zu Debugging-Zwecken tun können, ist, eine "echte" SQL-Abfrage "neu zu konstruieren", indem Sie die Werte in die SQL-Zeichenfolge der Anweisung einfügen.
Was ich normalerweise in solchen Situationen mache, ist:
var_dump
(oder ein Äquivalent) direkt danach, um die Werte der Parameter anzuzeigenDas ist beim Debuggen nicht besonders gut - aber das ist der Preis für vorbereitete Anweisungen und die damit verbundenen Vorteile.
quelle
Im Datenbankprotokoll suchen
Obwohl Pascal MARTIN richtig ist, dass PDO nicht die gesamte Abfrage auf einmal an die Datenbank sendet , konnte ich aufgrund des Vorschlags von Ryeguy , die Protokollierungsfunktion der Datenbank zu verwenden, die vollständige Abfrage als von der Datenbank zusammengestellt und ausgeführt sehen.
So geht's: (Diese Anweisungen gelten für MySQL auf einem Windows-Computer - Ihr Kilometerstand kann variieren.)
my.ini
unter dem[mysqld]
Abschnitt einenlog
Befehl hinzu, zlog="C:\Program Files\MySQL\MySQL Server 5.1\data\mysql.log"
Diese Datei wächst schnell. Löschen Sie sie daher unbedingt und deaktivieren Sie die Protokollierung, wenn Sie mit dem Testen fertig sind.
quelle
PDO::ATTR_EMULATE_PREPARES
. Siehe diese Antwort für weitere Informationen: stackoverflow.com/questions/10658865/#answer-10658929general_log
stattlog
. Siehe dev.mysql.com/doc/refman/5.5/en/query-log.htmlSicher können Sie in diesem Modus debuggen. Fügen Sie
{{ PDO::ATTR_ERRMODE }}
einfach vor Ihrer Abfrage eine neue Zeile hinzu, dann werden die Debug-Zeilen angezeigt.quelle
->query
wenn Sie vorbereitete Anweisungen verwenden?Wahrscheinlich möchten Sie debugDumpParams () für das Anweisungshandle verwenden. Sie können dies jederzeit ausführen, nachdem Sie Werte an die vorbereitete Abfrage gebunden haben (
execute()
die Anweisung ist nicht erforderlich ).Die vorbereitete Anweisung wird nicht für Sie erstellt, es werden jedoch Ihre Parameter angezeigt.
quelle
Ein alter Beitrag, aber vielleicht findet jemand dies nützlich;
quelle
Hier ist eine Funktion, um zu sehen, wie effektiv SQL sein wird. Dies geht aus einem Kommentar von "Mark" auf php.net hervor :
quelle
str_replace(":$k" ....
? Assoziative Indizes haben es bereits im Array $ params.:name_long
mit:name
. Zumindest wenn:name
vorher kommt:name_long
. Von MySQL vorbereitete Anweisungen können damit korrekt umgehen. Lassen Sie sich also nicht verwirren.Nein. PDO-Abfragen werden auf der Clientseite nicht vorbereitet. PDO sendet einfach die SQL-Abfrage und die Parameter an den Datenbankserver. Die Datenbank ist das, was die Substitution (der
?
's) bewirkt . Sie haben zwei Möglichkeiten:quelle
Über die Fehleranzeige wurde fast nichts gesagt, außer Fehlerprotokolle überprüfen, aber es gibt eine ziemlich hilfreiche Funktion:
( Quelllink )
Es ist klar, dass dieser Code geändert werden kann, um als Ausnahmemeldung oder andere Art der Fehlerbehandlung verwendet zu werden
quelle
Zum Beispiel haben Sie diese pdo-Anweisung:
Jetzt können Sie die ausgeführte Abfrage erhalten, indem Sie ein Array wie folgt definieren:
quelle
));
sollte sein);
(nur eine runde Klammer).Durch die Suche im Internet fand ich dies als akzeptable Lösung. Anstelle von PDO wird eine andere Klasse verwendet, und PDO-Funktionen werden durch magische Funktionsaufrufe aufgerufen. Ich bin nicht sicher, ob dies zu ernsthaften Leistungsproblemen führt. Es kann jedoch verwendet werden, bis PDO eine sinnvolle Protokollierungsfunktion hinzugefügt wird.
Gemäß diesem Thread können Sie einen Wrapper für Ihre PDO-Verbindung schreiben, der protokolliert und eine Ausnahme auslöst, wenn eine Fehlermeldung angezeigt wird.
Hier ist ein einfaches Beispiel:
Sie können diese Klasse also anstelle von PDOStatement verwenden:
Hier eine erwähnte PDO Decorator Implementierung:
quelle
Um MySQL in WAMP zu protokollieren , müssen Sie die Datei my.ini bearbeiten (z. B. unter wamp \ bin \ mysql \ mysql5.6.17 \ my.ini).
und hinzufügen zu
[mysqld]
:quelle
Hier ist eine Funktion, die ich gemacht habe, um eine SQL-Abfrage mit "aufgelösten" Parametern zurückzugeben.
Angenommen, Sie führen so aus
Diese Funktion fügt Abfragen KEINE Anführungszeichen hinzu, erledigt aber die Arbeit für mich.
quelle
Das Problem, das ich mit der Lösung zum Abfangen von PDO-Ausnahmen für Debugging-Zwecke hatte, ist, dass nur PDO-Ausnahmen (duh) abgefangen wurden, aber keine Syntaxfehler abgefangen wurden, die als PHP-Fehler registriert wurden (ich bin nicht sicher, warum dies so ist, aber " warum "ist für die Lösung irrelevant). Alle meine PDO-Aufrufe stammen aus einer einzelnen Tabellenmodellklasse, die ich für alle meine Interaktionen mit allen Tabellen erweitert habe. Dies war kompliziert, als ich versuchte, Code zu debuggen, da der Fehler die Zeile des PHP-Codes registrieren würde, in der sich mein Ausführungsaufruf befand rief an, sagte mir aber nicht, woher der Anruf tatsächlich kam. Ich habe den folgenden Code verwendet, um dieses Problem zu lösen:
Der obige Code fängt also sowohl PDO-Ausnahmen als auch PHP-Syntaxfehler ab und behandelt sie auf die gleiche Weise. Mein Fehlerbehandler sieht ungefähr so aus:
Wenn jemand bessere Ideen hat, wie er relevante Informationen an meinen Fehlerbehandler weiterleiten kann, als das Tabellenmodell als globale Variable festzulegen, würde ich mich freuen, es zu hören und meinen Code zu bearbeiten.
quelle
Dieser Code funktioniert gut für mich:
Vergessen Sie nicht, $ data und $ query durch Ihre Namen zu ersetzen
quelle
Ich benutze diese Klasse, um PDO zu debuggen (mit Log4PHP )
quelle
Genau dafür habe ich hier ein modernes Composer-geladenes Projekt / Repository erstellt:
pdo-debug
Hier finden Sie das GitHub-Zuhause des Projekts. Ein Blog-Beitrag erklärt es hier . Eine Zeile, die Sie in Ihre composer.json einfügen müssen, und dann können Sie sie folgendermaßen verwenden:
$ sql ist die unformatierte SQL-Anweisung, $ parameters ist ein Array Ihrer Parameter: Der Schlüssel ist der Platzhaltername (": user_id") oder die Nummer des unbenannten Parameters ("?"), der Wert ist .. na ja, der Wert.
Die Logik dahinter: Dieses Skript bewertet die Parameter einfach und ersetzt sie durch die bereitgestellte SQL-Zeichenfolge. Super einfach, aber für 99% Ihrer Anwendungsfälle sehr effektiv. Hinweis: Dies ist nur eine grundlegende Emulation, kein echtes PDO-Debugging (da dies nicht möglich ist, da PHP getrenntes SQL und Parameter an den MySQL-Server sendet).
Ein großes Dankeschön an bigwebguy und Mike vom StackOverflow-Thread Abrufen einer rohen SQL- Abfragezeichenfolge von PDO für das Schreiben der gesamten Hauptfunktion hinter diesem Skript. Groß auf!
quelle
So debuggen Sie PDO-MySQL-Datenbankabfragen in Ubuntu
TL; DR Protokollieren Sie alle Ihre Abfragen und beenden Sie das MySQL-Protokoll.
Diese Anweisungen gelten für meine Installation von Ubuntu 14.04. Geben Sie den Befehl ein
lsb_release -a
, um Ihre Version abzurufen. Ihre Installation kann anders sein.Aktivieren Sie die Anmeldung in MySQL
cd /etc/mysql
. Sie sollten eine Datei mit dem Namen sehenmy.cnf
. Das ist die Datei, die wir ändern werden.cat my.cnf | grep general_log
. Dadurch wird diemy.cnf
Datei für Sie gefiltert . Sie sollten zwei Einträge sehen:#general_log_file = /var/log/mysql/mysql.log
&&#general_log = 1
.sudo service mysql restart
.sudo service nginx restart
.Gute Arbeit! Du bist fertig. Jetzt müssen Sie nur noch die Protokolldatei abschließen, damit Sie die PDO-Abfragen Ihrer App in Echtzeit sehen können.
Beenden Sie das Protokoll, um Ihre Abfragen anzuzeigen
Geben Sie dieses cmd ein
tail -f /var/log/mysql/mysql.log
.Ihre Ausgabe sieht ungefähr so aus:
Alle neuen Abfragen, die Ihre App stellt, werden automatisch angezeigt, solange Sie das Protokoll weiter verfolgen. Um den Schwanz zu verlassen, drücken Sie
cmd/ctrl c
.Anmerkungen
truncate --size 0 mysql.log
.Kredit & danke
Ein großes Dankeschön an Nathan Longs Antwort oben, damit die Inspo dies auf Ubuntu herausfinden kann. Auch an Dikirill für seinen Kommentar zu Nathans Beitrag, der mich zu dieser Lösung führte.
Ich liebe dich Stackoverflow!
quelle
In der Debian NGINX-Umgebung habe ich Folgendes getan.
Gehen Sie zur
/etc/mysql/mysql.conf.d
Bearbeitung,mysqld.cnf
wenn Sielog-error = /var/log/mysql/error.log
die folgenden 2 Zeilen darunter finden.Um die Protokolle zu sehen, gehe zu
/var/log/mysql
undtail -f mysql.log
Denken Sie daran, diese Zeilen zu kommentieren, wenn Sie mit dem Debuggen fertig sind, wenn Sie sich in einer Produktionsumgebung befinden. Löschen Sie
mysql.log
diese, da diese Protokolldatei schnell wächst und sehr groß sein kann.quelle