Ich habe ein Modul, das sich schlecht benimmt. Ein EFQ liefert unerwartete Ergebnisse, aber ich kann nicht erkennen, warum dies so ist, wenn ich nur den Code betrachte. Gibt es ein dpq () -Äquivalent für EFQs? Andere Möglichkeiten zum Debuggen?
27
Antworten:
Es ist ein kleiner Hack, aber Sie können jedem
EntityFieldQuery
, der die Abfrage drucken möchte, ein Tag hinzufügen und dann implementierenhook_query_alter()
, um sie abzufangen, wenn es sich um einen Standard handeltSelectQuery
, und sie dann zum Debuggen in einen String umwandeln:Es ist ein bisschen hacken, aber macht den Trick. Die Ausgabe für das Obige ist:
Vermutlich funktioniert dies auch nur, wenn MySQL als Feldspeichersystem verwendet wird.
quelle
hook_query_alter()
die Abfrage nicht eine istEntityFieldQuery
nicht mehr, es ist zu einem Standard umgewandelt worden nach untendb_select()
, so__tostring()
funktioniert gut :) Da diese Arbeit aus Ich habe es ziemlich viel verwenden und es funktioniert ziemlich guthook_query_alter()
.Anstatt Ihren eigenen hook_query_alter () zu rollen, können Sie das Devel- Modul das schwere Heben für Sie erledigen lassen, indem Sie das
debug
Tag hinzufügen :Dadurch wird die Abfrage wie gewohnt auf dem Bildschirm
dpq()
ausgedruckt.quelle
Hinzufügen zur @Clive-Antwort, bei der die Abfrage in der Regel mit dem Platzhalter und nicht mit dem Wert gedruckt wird. Verwenden Sie den folgenden Code unter dem Hook_query_alter, um den Wert mit der Abfrage zu drucken.
Es wird nicht empfohlen, ein Modul für die wenigen Codezeilen zu installieren. Deshalb habe ich mich für die oben genannte Lösung entschieden.
quelle
Wenn Sie die Entwicklerversion von Nice DPQ (oder etwas anderes => 1.1) herunterladen , können Sie einfach Folgendes tun:
und du wirst die frage dpm'ed schön bekommen :). Der wichtige Teil im obigen Code ist addTag ('nicedpq') - das löst das aus
dpm()
.quelle
Sie können versuchen, es über XDebug zu debuggen . Führen Sie nach der Installation
xdebug_start_trace()
vor dem Code undxdebug_stop_trace()
danach ein eindeutiges Ablaufverfolgungsprotokoll aus, was und wo ausgeführt wurde.Sie können auch den Abfrage-Logger in der MySQL-Konfiguration aktivieren.
Die andere Methode ist, strace / truss / dtruss wie Debugger zu verwenden.
Beispiel mit dtruss:
alle Abfragen
spezifische Abfragen
Beachten Sie, dass dies
dtruss
nur ein Skript ist, das DTrace verwendet. Sie können also eine direkte Implementierung von statischen PHP DTrace- Tests oder DTracing MySQL in Betracht ziehen, indem Sie Ihr eigenes Skript schreiben.Weiterlesen : Erweitertes Debuggen von Drupal-Core über die Kommandozeile (strace & tcpdump)
quelle
Fügen Sie diese Funktion Ihrem Modul hinzu.
debug
Fügen Sie dann das Tag einem beliebigen EFQ hinzu. Erfordert die Aktivierung des Entwicklungsmoduls, um die Abfrage drucken zu können.quelle