Ho trascorso molto tempo a ricercare questa situazione per le mie esigenze. Questo e molti altri thread SO mi hanno aiutato moltissimo, quindi volevo condividere ciò che mi è venuto in mente.
Pur avendo accesso alla stringa di query interpolata è un vantaggio significativo durante la risoluzione dei problemi, volevamo essere in grado di mantenere un registro di solo alcune query (pertanto, utilizzare i registri del database per questo scopo non era l'ideale). Volevamo anche essere in grado di utilizzare i log per ricreare la condizione delle tabelle in qualsiasi momento, quindi, dovevamo assicurarci che le stringhe interpolate fossero sfuggite correttamente. Infine, volevamo estendere questa funzionalità a tutta la nostra base di codice, riscrivendone il meno possibile (scadenze, marketing e così; sai com'è).
La mia soluzione era quella di estendere la funzionalità dell'oggetto PDOStatement predefinito per memorizzare nella cache i valori (o riferimenti) parametrizzati e, quando viene eseguita l'istruzione, utilizzare la funzionalità dell'oggetto PDO per sfuggire correttamente ai parametri quando vengono reimmessi nella query corda. Potremmo quindi collegarci per eseguire il metodo dell'oggetto istruzione e registrare la query effettiva eseguita in quel momento ( o almeno il più fedele possibile di una riproduzione) .
Come ho detto, non volevamo modificare l'intera base di codice per aggiungere questa funzionalità, quindi sovrascriviamo i metodi predefiniti bindParam()
e i bindValue()
metodi dell'oggetto PDOStatement, eseguiamo la memorizzazione nella cache dei dati associati, quindi chiamiamo parent::bindParam()
o parent :: bindValue()
. Ciò ha consentito alla nostra base di codice esistente di continuare a funzionare normalmente.
Alla fine, quando execute()
viene chiamato il metodo, eseguiamo la nostra interpolazione e forniamo la stringa risultante come nuova proprietà E_PDOStatement->fullQuery
. Questo può essere emesso per visualizzare la query o, ad esempio, scritto in un file di registro.
L'estensione, insieme alle istruzioni di installazione e configurazione, sono disponibili su github:
https://github.com/noahheck/E_PDOStatement
DISCLAIMER :
Ovviamente, come ho già detto, ho scritto questa estensione. Poiché è stato sviluppato con l'aiuto di molti thread qui, volevo pubblicare qui la mia soluzione nel caso in cui qualcuno incontrasse questi thread, proprio come ho fatto io.