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

Ottenere una stringa di query SQL grezza da istruzioni preparate PDO

Presumo tu voglia dire che vuoi la query SQL finale, con i valori dei parametri interpolati in essa. Capisco che questo sarebbe utile per il debug, ma non è il modo in cui funzionano le istruzioni preparate. I parametri non sono combinati con un'istruzione preparata sul lato client, quindi PDO non dovrebbe mai avere accesso alla stringa di query combinata con i suoi parametri.

L'istruzione SQL viene inviata al server del database quando si esegue prepare() e i parametri vengono inviati separatamente quando si esegue execute(). Il registro delle query generali di MySQL mostra l'SQL finale con i valori interpolati dopo l'esecuzione(). Di seguito è riportato un estratto dal mio registro generale delle query. Ho eseguito le query dalla CLI di mysql, non da PDO, ma il principio è lo stesso.

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

Puoi anche ottenere ciò che desideri se imposti l'attributo PDO PDO::ATTR_EMULATE_PREPARES. In questa modalità, PDO interpola i parametri nella query SQL e invia l'intera query quando esegui(). Questa non è una vera query preparata. Eviterai i vantaggi delle query preparate interpolando le variabili nella stringa SQL prima di eseguire().

Commento di @afilina:

No, la query SQL testuale non combinato con i parametri durante l'esecuzione. Quindi non c'è niente da mostrare per la DOP.

Internamente, se si utilizza PDO::ATTR_EMULATE_PREPARES, PDO esegue una copia della query SQL e interpola i valori dei parametri prima di eseguire la preparazione e l'esecuzione. Ma PDO non espone questa query SQL modificata.

L'oggetto PDOStatement ha una proprietà $queryString, ma questa è impostata solo nel costruttore per PDOStatement e non viene aggiornata quando la query viene riscritta con parametri.

Sarebbe una richiesta di funzionalità ragionevole per PDO chiedere loro di esporre la query riscritta. Ma anche questo non ti darebbe la query "completa" a meno che tu non usi PDO::ATTR_EMULATE_PREPARES.

Questo è il motivo per cui mostro la soluzione sopra di utilizzare il registro delle query generali del server MySQL, perché in questo caso anche una query preparata con segnaposto dei parametri viene riscritta sul server, con i valori dei parametri inseriti nella stringa di query. Ma questo viene fatto solo durante la registrazione, non durante l'esecuzione della query.