sql >> Databasteknik >  >> RDS >> Mysql

Hämta rå SQL-frågesträng från PDO-förberedda satser

Jag antar att du menar att du vill ha den slutliga SQL-frågan, med parametervärden interpolerade i den. Jag förstår att detta skulle vara användbart för felsökning, men det är inte så förberedda uttalanden fungerar. Parametrar kombineras inte med en förberedd sats på klientsidan, så PDO ska aldrig ha tillgång till frågesträngen kombinerad med dess parametrar.

SQL-satsen skickas till databasservern när du preparerar(), och parametrarna skickas separat när du kör(). MySQL:s allmänna frågelogg visar den slutliga SQL-koden med värden interpolerade efter att du kört(). Nedan är ett utdrag ur min allmänna frågelogg. Jag körde frågorna från mysql CLI, inte från PDO, men principen är densamma.

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 också få vad du vill om du ställer in PDO-attributet PDO::ATTR_EMULATE_PREPARES. I det här läget interpolerar PDO parametrar i SQL-frågan och skickar hela frågan när du kör(). Detta är inte en riktig förberedd fråga. Du kommer att kringgå fördelarna med förberedda frågor genom att interpolera variabler i SQL-strängen innan execute().

Om kommentar från @afilina:

Nej, den textbaserade SQL-frågan är inte kombinerat med parametrarna under exekvering. Så det finns inget för PDO att visa dig.

Internt, om du använder PDO::ATTR_EMULATE_PREPARES, gör PDO en kopia av SQL-frågan och interpolerar parametervärden i den innan du gör förberedelser och kör. Men PDO exponerar inte denna modifierade SQL-fråga.

PDOStatement-objektet har en egenskap $queryString, men denna är endast inställd i konstruktorn för PDOStatement, och den uppdateras inte när frågan skrivs om med parametrar.

Det skulle vara en rimlig funktionsbegäran för PDO att be dem att avslöja den omskrivna frågan. Men även det skulle inte ge dig den "fullständiga" frågan om du inte använder PDO::ATTR_EMULATE_PREPARES.

Det är därför jag visar lösningen ovan för att använda MySQL-serverns allmänna frågelogg, för i det här fallet skrivs även en förberedd fråga med parameterplatshållare om på servern, med parametervärden återfyllda i frågesträngen. Men detta görs bara under loggning, inte under körning av en fråga.



  1. Delad funktion motsvarande i T-SQL?

  2. Hur man snabbt skriver Select Query i SQL Server - SQL Server / TSQL Tutorial Del 108

  3. Så här fixar du säkerhetsrådgivarens MySQL-varning

  4. INSERT INTO...SELECT för alla MySQL-kolumner