Ich nehme an, Sie meinen, Sie möchten die endgültige SQL-Abfrage mit darin interpolierten Parameterwerten. Ich verstehe, dass dies für das Debuggen nützlich wäre, aber es ist nicht die Art und Weise, wie vorbereitete Anweisungen funktionieren. Parameter werden auf der Clientseite nicht mit einer vorbereiteten Anweisung kombiniert, daher sollte PDO niemals Zugriff auf die Abfragezeichenfolge haben, die mit ihren Parametern kombiniert ist.
Die SQL-Anweisung wird beim Vorbereiten () an den Datenbankserver gesendet, und die Parameter werden beim Ausführen () separat gesendet. Das allgemeine Abfrageprotokoll von MySQL zeigt das endgültige SQL mit Werten an, die nach der Ausführung von () interpoliert wurden. Unten finden Sie einen Auszug aus meinem allgemeinen Abfrageprotokoll. Ich habe die Abfragen über die MySQL-CLI ausgeführt, nicht über 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 das erhalten, was Sie möchten, wenn Sie das PDO-Attribut PDO :: ATTR_EMULATE_PREPARES festlegen. In diesem Modus interpoliert PDO Parameter in die SQL-Abfrage und sendet die gesamte Abfrage, wenn Sie () ausführen. Dies ist keine wirklich vorbereitete Abfrage. Sie umgehen die Vorteile vorbereiteter Abfragen, indem Sie vor der Ausführung von Variablen Variablen in die SQL-Zeichenfolge interpolieren.
Kommentar von @afilina:
Nein, die textuelle SQL-Abfrage wird während der Ausführung nicht 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 in diese, bevor Sie sie vorbereiten und ausführen. PDO macht diese geänderte SQL-Abfrage jedoch nicht verfügbar.
Das PDOStatement-Objekt hat die Eigenschaft $ queryString, diese wird jedoch 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 umgeschriebene Abfrage offenzulegen. Aber selbst das würde Ihnen nicht die "vollständige" Abfrage geben, wenn Sie nicht PDO :: ATTR_EMULATE_PREPARES verwenden.
Aus diesem Grund zeige ich die obige Problemumgehung für die Verwendung des allgemeinen Abfrageprotokolls des MySQL-Servers, da in diesem Fall sogar eine vorbereitete Abfrage mit Platzhaltern für Parameter auf dem Server neu geschrieben wird und Parameterwerte in die Abfragezeichenfolge zurückgefüllt werden. Dies erfolgt jedoch nur während der Protokollierung, nicht während der Ausführung der Abfrage.