Zakładam, że masz na myśli, że chcesz otrzymać końcowe zapytanie SQL z interpolowanymi wartościami parametrów. Rozumiem, że byłoby to przydatne do debugowania, ale nie jest to sposób, w jaki działają przygotowane instrukcje. Parametry nie są łączone z przygotowaną instrukcją po stronie klienta, więc PDO nigdy nie powinno mieć dostępu do ciągu zapytania w połączeniu z jego parametrami.
Instrukcja SQL jest wysyłana do serwera bazy danych podczas przygotowywania (), a parametry są wysyłane osobno, gdy wykonujesz wykonywanie (). Ogólny dziennik zapytań MySQL pokazuje ostateczny kod SQL z wartościami interpolowanymi po wykonaniu (). Poniżej znajduje się fragment mojego ogólnego dziennika zapytań. Uruchomiłem zapytania z mysql CLI, a nie z PDO, ale zasada jest taka sama.
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
Możesz również uzyskać to, co chcesz, jeśli ustawisz atrybut PDO PDO :: ATTR_EMULATE_PREPARES. W tym trybie PDO interpoluje parametry do zapytania SQL i wysyła całe zapytanie podczas wykonywania (). To nie jest prawdziwie przygotowane zapytanie. Możesz obejść korzyści płynące z przygotowanych zapytań, interpolując zmienne do ciągu SQL przed wykonaniem execute ().
Komentarz od @afilina:
Nie, tekstowe zapytanie SQL nie jest łączone z parametrami podczas wykonywania. Więc PDO nie ma nic do pokazania.
Wewnętrznie, jeśli używasz PDO :: ATTR_EMULATE_PREPARES, PDO tworzy kopię zapytania SQL i interpoluje do niej wartości parametrów przed przygotowaniem i wykonaniem. Ale PDO nie ujawnia tego zmodyfikowanego zapytania SQL.
Obiekt PDOStatement ma właściwość $ queryString, ale jest ona ustawiana tylko w konstruktorze dla PDOStatement i nie jest aktualizowana, gdy zapytanie jest przepisywane z parametrami.
Byłoby rozsądnym żądaniem funkcji dla PDO, aby poprosić ich o ujawnienie przepisanego zapytania. Ale nawet to nie dałoby „kompletnego” zapytania, chyba że użyjesz PDO :: ATTR_EMULATE_PREPARES.
Dlatego powyżej pokazuję obejście polegające na używaniu ogólnego dziennika zapytań serwera MySQL, ponieważ w tym przypadku nawet przygotowane zapytanie z symbolami zastępczymi parametrów jest przepisywane na serwerze, z wartościami parametrów wpisywanymi do ciągu zapytania. Ale dzieje się to tylko podczas logowania, a nie podczas wykonywania zapytania.