sql >> Database teknologi >  >> RDS >> Mysql

Henter rå SQL-forespørgselsstreng fra PDO-forberedte sætninger

Jeg antager, at du mener, at du vil have den endelige SQL-forespørgsel, med parameterværdier interpoleret i den. Jeg forstår, at dette ville være nyttigt til fejlretning, men det er ikke den måde, forberedte udsagn fungerer på. Parametre er ikke kombineret med en forberedt sætning på klientsiden, så PDO bør aldrig have adgang til forespørgselsstrengen kombineret med dens parametre.

SQL-sætningen sendes til databaseserveren, når du forbereder(), og parametrene sendes separat, når du udfører(). MySQL's generelle forespørgselslog viser den endelige SQL med værdier interpoleret efter du har udført(). Nedenfor er et uddrag fra min generelle forespørgselslog. Jeg kørte forespørgslerne fra mysql CLI, ikke fra PDO, men princippet er det samme.

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

Du kan også få, hvad du ønsker, hvis du indstiller PDO-attributten PDO::ATTR_EMULATE_PREPARES. I denne tilstand interpolerer PDO parametre i SQL-forespørgslen og sender hele forespørgslen, når du udfører(). Dette er ikke en ægte forberedt forespørgsel. Du vil omgå fordelene ved forberedte forespørgsler ved at interpolere variabler i SQL-strengen før execute().

Rekommentar fra @afilina:

Nej, den tekstmæssige SQL-forespørgsel er ikke kombineret med parametrene under udførelsen. Så der er ikke noget for PDO at vise dig.

Internt, hvis du bruger PDO::ATTR_EMULATE_PREPARES, laver PDO en kopi af SQL-forespørgslen og interpolerer parameterværdier i den, før du forbereder og udfører. Men PDO afslører ikke denne ændrede SQL-forespørgsel.

PDOStatement-objektet har en egenskab $queryString, men dette er kun indstillet i konstruktøren for PDOStatementet, og det opdateres ikke, når forespørgslen omskrives med parametre.

Det ville være en rimelig funktionsanmodning for PDO at bede dem om at afsløre den omskrevne forespørgsel. Men selv det ville ikke give dig den "komplette" forespørgsel, medmindre du bruger PDO::ATTR_EMULATE_PREPARES.

Det er grunden til, at jeg viser løsningen ovenfor ved at bruge MySQL-serverens generelle forespørgselslog, fordi i dette tilfælde bliver selv en forberedt forespørgsel med parameterpladsholdere omskrevet på serveren, med parameterværdier tilbagefyldt i forespørgselsstrengen. Men dette gøres kun under logning, ikke under udførelse af forespørgsler.



  1. Forstå lagringsstørrelser for MySQL TEXT-datatyper

  2. Øjeblikkelig filinitialisering:Virkning under opsætning

  3. 7 ting at passe på i din PostgreSQL-implementering

  4. Native Library sqljdbc_auth.dll er allerede indlæst i en anden klasseindlæser