Saya menghabiskan banyak waktu meneliti situasi ini untuk kebutuhan saya sendiri. Ini dan beberapa utas SO lainnya sangat membantu saya, jadi saya ingin membagikan apa yang saya hasilkan.
Meskipun memiliki akses ke string kueri yang diinterpolasi adalah manfaat yang signifikan saat pemecahan masalah, kami ingin dapat mempertahankan log hanya dari kueri tertentu (oleh karena itu, menggunakan log basis data untuk tujuan ini tidak ideal). Kami juga ingin dapat menggunakan log untuk menciptakan kembali kondisi tabel pada waktu tertentu, oleh karena itu, kami perlu memastikan string yang diinterpolasi lolos dengan benar. Akhirnya, kami ingin memperluas fungsionalitas ini ke seluruh basis kode kami harus menulis ulang sesedikit mungkin (tenggat waktu, pemasaran, dan semacamnya; Anda tahu bagaimana ini).
Solusi saya adalah untuk memperluas fungsionalitas objek PDOStatement default untuk cache nilai parameter (atau referensi), dan ketika pernyataan dieksekusi, gunakan fungsionalitas objek PDO untuk keluar dari parameter dengan benar ketika mereka disuntikkan kembali ke permintaan tali. Kami kemudian dapat mengikat untuk mengeksekusi metode objek pernyataan dan mencatat permintaan aktual yang dieksekusi pada waktu itu ( atau setidaknya setepat reproduksi mungkin) .
Seperti yang saya katakan, kami tidak ingin memodifikasi seluruh basis kode untuk menambahkan fungsionalitas ini, jadi kami menimpa default bindParam()
dan bindValue()
metode objek PDOStatement, melakukan caching kami terhadap data yang terikat, kemudian memanggil parent::bindParam()
atau induk :: bindValue()
. Ini memungkinkan basis kode kami yang ada untuk terus berfungsi seperti biasa.
Akhirnya, ketika execute()
metode dipanggil, kami melakukan interpolasi kami dan memberikan string yang dihasilkan sebagai properti baru E_PDOStatement->fullQuery
. Ini bisa berupa output untuk melihat kueri atau, misalnya, ditulis ke file log.
Ekstensi, bersama dengan petunjuk pemasangan dan konfigurasi, tersedia di github:
https://github.com/noahheck/E_PDOStatement
PENOLAKAN :
Jelas, seperti yang saya sebutkan, saya menulis ekstensi ini. Karena ini dikembangkan dengan bantuan dari banyak utas di sini, saya ingin memposting solusi saya di sini kalau-kalau ada orang lain menemukan utas ini, sama seperti yang saya lakukan.