J'ai passé beaucoup de temps à étudier cette situation pour mes propres besoins. Cela et plusieurs autres fils SO m'ont beaucoup aidé, alors je voulais partager ce que j'avais trouvé.
Bien que l'accès à la chaîne de requête interpolée soit un avantage significatif lors du dépannage, nous voulions pouvoir maintenir un journal de certaines requêtes uniquement (par conséquent, l'utilisation des journaux de la base de données à cette fin n'était pas idéale). Nous voulions également pouvoir utiliser les journaux pour recréer l'état des tables à un moment donné, par conséquent, nous devions nous assurer que les chaînes interpolées étaient correctement échappées. Enfin, nous voulions étendre cette fonctionnalité à l'ensemble de notre base de code en en réécrivant le moins possible (délais, marketing, etc., vous savez comment c'est).
Ma solution était d'étendre la fonctionnalité de l'objet PDOStatement par défaut pour mettre en cache les valeurs paramétrées (ou références), et lorsque l'instruction est exécutée, utiliser la fonctionnalité de l'objet PDO pour échapper correctement aux paramètres lorsqu'ils sont réinjectés dans la requête chaîne. Nous pourrions alors nous connecter pour exécuter la méthode de l'objet instruction et enregistrer la requête réelle qui a été exécutée à ce moment-là ( ou au moins aussi fidèle que possible d'une reproduction) .
Comme je l'ai dit, nous ne voulions pas modifier la base de code entière pour ajouter cette fonctionnalité, nous écrasons donc la valeur par défaut bindParam()
et les bindValue()
méthodes de l'objet PDOStatement, faisons notre mise en cache des données liées, puis appelons parent::bindParam()
ou parent :: bindValue()
. Cela a permis à notre base de code existante de continuer à fonctionner normalement.
Enfin, lorsque la execute()
méthode est appelée, nous effectuons notre interpolation et fournissons la chaîne résultante en tant que nouvelle propriétéE_PDOStatement->fullQuery
. Cela peut être généré pour afficher la requête ou, par exemple, écrit dans un fichier journal.
L'extension, ainsi que les instructions d'installation et de configuration, sont disponibles sur github:
https://github.com/noahheck/E_PDOStatement
AVERTISSEMENT :
Évidemment, comme je l'ai mentionné, j'ai écrit cette extension. Parce qu'il a été développé avec l'aide de nombreux threads ici, je voulais publier ma solution ici au cas où quelqu'un d'autre rencontrerait ces fils, tout comme je l'ai fait.