Abrufen (oder simulieren) vollständige Abfrage von PDO prepared statement
Stolperte ich über diese Frage von vor zwei Jahren.
Gibt es eine Möglichkeit die roh-SQL-string ausgeführt beim Aufruf von PDOStatement::execute() auf eine vorbereitete Anweisung? Für debugging-Zwecke wäre dies sehr nützlich sein.
Die Gewinner Antwort besagt, dass
[...] Sie können auch das bekommen, was Sie wollen, wenn Sie
einstellen des PDO-Attribut
PDO::ATTR_EMULATE_PREPARES. In diesem
Modus, PDO Parameter in interpolieren
die SQL-Abfrage aus und sendet das ganze
Abfrage, wenn Sie Sie ausführen().
Aber wird nicht erwähnt, wie man die resultierende Abfrage-string. Ich weiß, es ist eine schlechte Idee, Leistung klug, aber das stört mich nicht im debug-Modus. Weiß jemand, wie dies zu tun?
PS Wenn es eine Möglichkeit gibt, ich hätte wiedereröffnet /die Aufmerksamkeit auf die ursprüngliche zwei-Jahres-altes Thema, anstatt eine neue zu öffnen, bitte lassen Sie mich wissen.
- Die akzeptierte Antwort nicht sagen Ihnen, wo Sie entdecken Sie die Abfrage: in Ihrem Datenbank-server anmelden.
- Ja ich lese das auch. Er sagt: "MySQL-general query log zeigt die letzten SQL mit Werten interpoliert, nachdem Sie die execute()". Aber dann geht auf zu sagen, "Sie können auch das bekommen, was Sie wollen, wenn...", was darauf hindeutet, gibt es einen zweiten Weg. Das ist es, was ich herausfinden will. Wie es zu tun, ohne Zugriff auf den kompletten mysql-server-Protokoll.
- Ich denke, es bedeutete, dass, anstatt uns auf die Protokolle für die vorbereitete Anweisung und dann die server-synthetisiert Anweisung danach können Sie auch PHP generieren, die vollständige SQL-Abfrage auf der client-Seite, und dann ist die einzige Sache, die im server-log wird die eigentliche SQL-Abfrage, die Sie ausgeführt. Das heißt, die Antwort war die Beschreibung der zwei verschiedenen Möglichkeiten, um die Abfrage in den server-log.
- +1 Für diesen Kommentar! Aber ich hoffe immer noch, du liegst falsch 🙂
- Drehen auf server-logs ist der beste Weg, um dies zu tun: wenn ich hatte nicht wartete Stunden, um es zu tun, es würde haben mich gerettet, Stunden: Anweisungen für die Protokollierung PDO prepared statements
- Paniflov die Antwort von unten ist das, was ich gesucht hatte - einige von uns wollen-Abfragen geschrieben, um eine kombinierte Anwendung anmelden, anstatt auf einem dedizierten server anmelden, da die Korrelation mit Zeitstempel versehene Einträge aus einer Anwendung anmelden, die mit einem Datenbank-log ist sehr umständlich...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, das ist bereits in der ursprünglichen Frage war das die Referenz in dieser. Allerdings
es ist eigentlich eine Methode für das abrufen dieser Daten.
PDOStatement::debugDumpParams
Aber es ist derzeit nicht funktioniert, wie dokumentiert. Gibt es einen Bugreport und patch eingereicht, für die es hier http://bugs.php.net/bug.php?id=52384 falls jemand interessiert ist in Abstimmung. Bis es behoben, wie es scheint, Sie sind Links verwenden des Abfrage-Protokollierung oder die Einstellung einer benutzerdefinierten Anweisung-Klasse mit PDO::ATTR_STATEMENT_CLASS Attribut.
Afaik PDO nicht wirklich aussetzen Sie. Auf dem development-Server, kann die Allgemeine Anfragen-log für MySQL (wenn es das ist, was Sie verwenden), mit möglicherweise mehr Kontrolle mit sql_log_off, die nicht verlangen, die SUPER-Berechtigung.
Wenn Sie nicht bekommen kann es von der PDO selbst, erwägen Sie die Verwendung einer wrapper-Klasse nur für
PDOStatement::execute()
die log der SQL Abfrage und Werte, und rufen Sie dannexecute()
auf die Anweisung. Sie haben zum umgestalten von code zur Verwendung der neuen Klasse.Nebenbei, ich sehe, dass PDOStatement hat eine Klasse variable
$queryString
hält, dass die Abfrage verwendet wird. Die Werte werden abgerufen, was ging inexecute()
oderbindParam()
.Zunächst einige utility-Funktionen für die Protokollierung:
Option 1: wrapper-Klasse um PDOStatement
Dann ist dein code sein:
statt
Denken mehr darüber, Sie könnte nehmen Sie es mit einer weiteren:
Option 2: Erweitern Sie PDO und PDOStatement
Wenn Sie wollen, abenteuerlustig zu sein, die Sie erweitern können PDOStatement zu tun, die Anmeldung für Sie, und PDO für die Rückgabe Ihres erweiterten PDOStatement-Klasse. Dies erfordert den geringst möglichen Umgestaltung, dh ändern Sie einfach
new PDO()
zunew MY_PDO()
, aber könnte schwierig in der Umsetzung, wie Sie benötigen würde, um explizit definieren PDOStatement Funktionalität, die Sie benötigen in MY_PDOStatement es geht also ordnungsgemäß aufgerufen.Aber jetzt kann der code sein:
execute($values)
verwendet werden würde, wie ich es Tue, in meiner eigenen db-wrapper. Gotcha.ereg*
Funktionen sind veraltet. Sollten Sie verwendenpreg*
Funktionen: stackoverflow.com/questions/6270004/...Ist der beste Ansatz meiner Meinung nach ist die Verwendung des mysql-log zu zeigen, die letzten Anfragen, die lief wie immer direkt im php ist eine drag.
Aus
So zeigen Sie die zuletzt ausgeführten Abfragen auf MySQL? erste Antwort:
Zusätzlich, für diejenigen gesegnet mit MySQL >= 5.1.12:
Werfen Sie einen Blick auf die Tabelle mysql.general_log
Wenn Sie es vorziehen, um die Ausgabe in eine Datei:
Ich bevorzuge diese Methode, weil:
du bist nicht Bearbeiten mein.cnf-Datei und potenziell dauerhaft einschalten der Protokollierung
du bist nicht Angeln rund um das Dateisystem auf der Suche für die Abfrage von log - oder noch schlimmer, abgelenkt durch die Notwendigkeit für die perfekte destination. /var/log /var/data/log /opt /home/mysql_savior/var
Neustart des Servers bleiben Sie, wo Sie begann (log off)
Weitere Informationen finden Sie unter MySQL 5.1 Reference Manual - Server-System-Variablen - general_log
Folgende statische Methode nimmt ein PDO query-template (eine SQL-Abfrage mit
?
- und/oder:name
Platzhalter) und interpoliert die Parameter:Angegeben durch den Namen der Methode, die Sie verwenden sollten, diese nur zu debugging-Zwecken.