Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Pobieranie nieprzetworzonego ciągu zapytania SQL z przygotowanych instrukcji PDO

Zakładam, że masz na myśli to, że chcesz uzyskać ostateczne zapytanie SQL, z interpolowanymi wartościami parametrów. Rozumiem, że przydałoby się to przy debugowaniu, ale tak nie 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 połączonego z jego parametrami.

Instrukcja SQL jest wysyłana do serwera bazy danych, gdy wykonujesz przygotowanie(), a parametry są wysyłane osobno, gdy wykonujesz execute(). Ogólny dziennik zapytań MySQL pokazuje końcowy kod SQL z wartościami interpolowanymi po wykonaniu funkcji(). 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, czego chcesz, ustawiając 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 naprawdę przygotowane zapytanie. Ominiesz korzyści płynące z przygotowanych zapytań, interpolując zmienne do ciągu SQL przed wykonaniem().

Ponownie komentarz od @afiliny:

Nie, tekstowe zapytanie SQL nie w połączeniu z parametrami podczas wykonywania. Tak 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 niego wartości parametrów przed wykonaniem przygotowania i wykonania. 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.

Rozsądną prośba o funkcję dla PDO byłaby poproszenie ich o ujawnienie przepisanego zapytania. Ale nawet to nie dałoby "kompletnego" zapytania, chyba że użyjesz PDO::ATTR_EMULATE_PREPARES.

Dlatego przedstawiam powyższe obejście polegające na użyciu ogólnego dziennika zapytań serwera MySQL, ponieważ w tym przypadku nawet przygotowane zapytanie z symbolami zastępczymi parametrów jest przepisywane na serwerze, a wartości parametrów są uzupełniane w ciągu zapytania. Ale odbywa się to tylko podczas logowania, a nie podczas wykonywania zapytania.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak ponownie zsynchronizować bazę danych Mysql, jeśli Master i Slave mają inną bazę danych w przypadku replikacji Mysql?

  2. Wyszukaj dopasowanie całych słów w MySQL

  3. phpMyBackupPro — internetowe narzędzie do tworzenia kopii zapasowych MySQL dla systemu Linux

  4. Naucz się podstawowych zapytań SQL przy użyciu MySQL

  5. Jak znaleźć n-tą pozycję w MySQL?