Wir verwenden Doctrine, ein PHP-ORM. Ich erstelle eine Abfrage wie folgt:
$q = Doctrine_Query::create()->select('id')->from('MyTable');
und dann füge ich in der Funktion verschiedene where-Klauseln und entsprechende Dinge hinzu
$q->where('normalisedname = ? OR name = ?', array($string, $originalString));
Später, bevor execute()
ich dieses Abfrageobjekt erhalte, möchte ich das unformatierte SQL ausdrucken, um es zu untersuchen, und dies tun:
$q->getSQLQuery();
Dies druckt jedoch nur die vorbereitete Anweisung aus, nicht die vollständige Abfrage. Ich möchte sehen, was es an MySQL sendet, aber stattdessen druckt es eine vorbereitete Anweisung aus, einschließlich ?
's. Gibt es eine Möglichkeit, die 'vollständige' Abfrage anzuzeigen?
Antworten:
Doctrine sendet keine "echte SQL-Abfrage" an den Datenbankserver: Es werden tatsächlich vorbereitete Anweisungen verwendet, was bedeutet:
$query->getSql()
)$query->getParameters()
)Dies bedeutet, dass es auf der PHP-Seite niemals eine "echte" SQL-Abfrage gibt - Doctrine kann sie daher nicht anzeigen.
quelle
$query->getParameters();
gibt die Parameter NICHT in der richtigen Reihenfolge zurück, da sie in der vorbereiteten Abfrageanweisung erscheinen solltenEin Arbeitsbeispiel:
quelle
Sie können die von Ihrer App ausgeführte Abfrage überprüfen, wenn Sie alle Abfragen in MySQL protokollieren:
http://dev.mysql.com/doc/refman/5.1/en/query-log.html
Es wird mehr Abfragen geben, nicht nur die, die Sie suchen, sondern Sie können danach suchen.
->getSql();
funktioniert aber normalerweiseBearbeiten:
um alle von mir verwendeten MySQL-Abfragen anzuzeigen
und fügen Sie diese 2 Zeilen hinzu:
und starte mysql neu
quelle
Ich habe einen Doctrine2-Logger erstellt, der genau dies tut. Es "hydratisiert" die parametrisierte SQL-Abfrage mit den Werten unter Verwendung von Doctrine 2-eigenen Datentypkonvertern.
Anwendungsbeispiel:; Der folgende Code-Frieden gibt bei der Standardausgabe alle mit $ em Entity Manager generierten SQL-Sätze INSERT, UPDATE und DELETE wieder.
quelle
getSqlQuery()
Zeigt technisch den gesamten SQL-Befehl an, ist jedoch viel nützlicher, wenn Sie auch die Parameter sehen können.Um dieses Muster wiederverwendbarer zu machen, gibt es einen netten Ansatz, der in den Kommentaren unter Raw SQL von Doctrine Query Object beschrieben wird .
quelle
$q
. Es scheint weder die Abfrage noch der Abfrage-Generator zu sein.$q
In diesem Fall handelt es sich um eine Doctrine 1-Abfrage. Möglicherweise verwenden Sie Doctrine 2. In diesem Fall möchten Sie so etwas wie$qb = $this->createQueryBuilder('a'); $q = $qb->getQuery(); $sql = $q->getSQL(); $params = $q->getParameters();
Hoffentlich hilft das!Es gibt keine andere echte Abfrage. So funktionieren vorbereitete Anweisungen. Die Werte werden auf dem Datenbankserver und nicht in der Anwendungsschicht gebunden.
Siehe meine Antwort auf diese Frage: Wie überprüfe ich in PHP mit PDO die endgültige parametrisierte SQL-Abfrage?
(Zur Vereinfachung hier wiederholt :)
quelle
Meine Lösung:
Anwendungsbeispiel:
quelle
Mit dem folgenden Ansatz können Sie problemlos auf die SQL-Parameter zugreifen.
Also, wenn Sie das
$param_values
und ausgedruckt haben$col_names
, können Sie die Parameterwerte über die SQL- und die jeweiligen Spaltennamen abrufen.Hinweis: Wenn
$param
ein Array zurückgegeben wird, müssen Sie es als Parameter wiederholenIN (:?)
normalerweise als verschachteltes Array vorliegen.Wenn Sie in der Zwischenzeit einen anderen Ansatz gefunden haben, teilen Sie uns dies bitte mit :)
Danke dir!
quelle
Klarere Lösung:
quelle
quelle
Sie können verwenden:
Wenn Sie MySQL verwenden, können Sie Workbench verwenden, um laufende SQL-Anweisungen anzuzeigen. Sie können die laufende Abfrage auch über MySQL anzeigen, indem Sie Folgendes verwenden:
quelle
Vielleicht kann es für jemanden nützlich sein:
quelle
TL; DR
Verwenden Sie in Ihren Zweigdateien die Zweighilfefilter von Doctrine:
Erläuterung:
Die anderen Antworten, in denen erwähnt wird, dass vorbereitete Anweisungen tatsächlich "echte Abfragen" sind, sind richtig, aber sie beantworten nicht die offensichtlichen Erwartungen des Fragestellers ... Jeder Entwickler möchte eine "ausführbare Abfrage" zum Debuggen anzeigen (oder sie dem Benutzer anzeigen). .
Also habe ich in der Quelle des Symfony-Profilers nachgesehen, wie sie das machen. Der Doctrine-Teil liegt in der Verantwortung von Doctrine, daher haben sie ein Doctrine-Bündel zur Integration in Symfony erstellt. Einen Blick auf die
doctrine-bundle/Resources/views/Collector/db.html.twig
Datei , werden Sie herausfinden, wie sie dies tun (dies kann sich je nach Version ändern). Interessanterweise haben sie Zweigfilter erstellt, die wir wiederverwenden können (siehe oben).Damit alles funktioniert, müssen wir die Protokollierung für unsere Abfrage aktivieren. Es gibt mehrere Möglichkeiten, dies zu tun, und hier verwende ich DebugStack, mit dem Abfragen protokolliert werden können, ohne sie tatsächlich zu drucken. Dies stellt auch sicher, dass dies im Produktionsmodus funktioniert, wenn Sie dies benötigen ...
Wenn Sie weitere Formatierungen benötigen, werden Sie feststellen, dass sie CSS in einem Style-Tag enthalten. Stehlen Sie es also einfach ^^:
Hoffe das wird helfen ;-)
quelle
Ich habe einen einfachen Logger geschrieben, der Abfragen mit eingefügten Parametern protokollieren kann. Installation:
Verwendung:
quelle
quelle
Die Funktion @dsamblas wurde so geändert, dass sie funktioniert, wenn Parameter Datumszeichenfolgen wie diese '2019-01-01' sind und wenn ein Array mit IN like übergeben wird
. Machen Sie also alles, was dsamblas geschrieben hat, aber ersetzen Sie startQuery durch dieses oder sehen Sie sich die Unterschiede an und fügen Sie meinen Code hinzu. (falls er etwas in seiner Funktion geändert hat und meine Version keine Änderungen hat).
Hat nicht viel getestet.
quelle
Ich habe einige Nachforschungen zu diesem Thema angestellt, weil ich eine generierte SQL-Abfrage debuggen und im SQL-Editor ausführen wollte. Wie aus allen Antworten hervorgeht, handelt es sich um ein hochtechnisches Thema.
Wenn ich davon ausgehe, dass die erste Frage auf dev-env basiert, fehlt im Moment eine sehr einfache Antwort. Sie können einfach den Build in Symfony Profiler verwenden. Klicken Sie einfach auf die Registerkarte "Doktrin" und blättern Sie zu der Abfrage, die Sie überprüfen möchten. Klicken Sie dann auf "Ausführbare Abfrage anzeigen" und Sie können Ihre Abfrage direkt in Ihren SQL-Editor einfügen
Mehr UI-Basisansatz, aber sehr schnell und ohne Debugging-Code-Overhead.
quelle
quelle
Verwenden Sie Folgendes, um eine SQL-Abfrage in Doctrine auszudrucken:
quelle