Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Abrufen einer rohen SQL-Abfragezeichenfolge aus PDO-vorbereiteten Anweisungen

Ich nehme an, Sie meinen, dass Sie die endgültige SQL-Abfrage mit interpolierten Parameterwerten wünschen. Ich verstehe, dass dies zum Debuggen nützlich wäre, aber so funktionieren vorbereitete Anweisungen nicht. Parameter werden nicht mit einer vorbereiteten Anweisung auf der Client-Seite kombiniert, daher sollte PDO niemals Zugriff auf die Abfragezeichenfolge in Kombination mit ihren Parametern haben.

Die SQL-Anweisung wird an den Datenbankserver gesendet, wenn Sie „prepare()“ ausführen, und die Parameter werden separat gesendet, wenn Sie „execute()“ ausführen. Das allgemeine Abfrageprotokoll von MySQL zeigt das endgültige SQL mit interpolierten Werten, nachdem Sie execute() ausgeführt haben. Unten ist ein Auszug aus meinem allgemeinen Abfrageprotokoll. Ich habe die Abfragen von der mysql-CLI ausgeführt, nicht von PDO, aber das Prinzip ist dasselbe.

081016 16:51:28 2 Query       prepare s1 from 'select * from foo where i = ?'
                2 Prepare     [2] select * from foo where i = ?
081016 16:51:39 2 Query       set @a =1
081016 16:51:47 2 Query       execute s1 using @a
                2 Execute     [2] select * from foo where i = 1

Sie können auch bekommen, was Sie wollen, wenn Sie das PDO-Attribut PDO::ATTR_EMULATE_PREPARES setzen. In diesem Modus interpoliert PDO Parameter in die SQL-Abfrage und sendet die gesamte Abfrage, wenn Sie execute() ausführen. Dies ist keine echte vorbereitete Abfrage. Sie werden die Vorteile vorbereiteter Abfragen umgehen, indem Sie vor execute() Variablen in die SQL-Zeichenfolge interpolieren.

Re-Kommentar von @afilina:

Nein, die Text-SQL-Abfrage ist nicht während der Ausführung mit den Parametern kombiniert. PDO kann Ihnen also nichts zeigen.

Wenn Sie PDO::ATTR_EMULATE_PREPARES verwenden, erstellt PDO intern eine Kopie der SQL-Abfrage und interpoliert Parameterwerte darin, bevor es vorbereitet und ausgeführt wird. PDO macht diese modifizierte SQL-Abfrage jedoch nicht verfügbar.

Das PDOStatement-Objekt hat eine Eigenschaft $queryString, aber diese wird nur im Konstruktor für das PDOStatement festgelegt und nicht aktualisiert, wenn die Abfrage mit Parametern neu geschrieben wird.

Es wäre eine vernünftige Funktionsanforderung für PDO, sie zu bitten, die neu geschriebene Abfrage bereitzustellen. Aber selbst das würde Ihnen nicht die "vollständige" Abfrage liefern, es sei denn, Sie verwenden PDO::ATTR_EMULATE_PREPARES.

Aus diesem Grund zeige ich oben die Problemumgehung der Verwendung des allgemeinen Abfrageprotokolls des MySQL-Servers, da in diesem Fall sogar eine vorbereitete Abfrage mit Parameterplatzhaltern auf dem Server neu geschrieben wird, wobei Parameterwerte in den Abfragestring zurückgefüllt werden. Dies geschieht jedoch nur während der Protokollierung, nicht während der Abfrageausführung.