Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Mendapatkan string kueri SQL mentah dari pernyataan yang disiapkan PDO

Saya berasumsi maksud Anda bahwa Anda menginginkan kueri SQL terakhir, dengan nilai parameter diinterpolasi ke dalamnya. Saya mengerti bahwa ini akan berguna untuk debugging, tetapi ini bukan cara kerja pernyataan yang disiapkan. Parameter tidak digabungkan dengan pernyataan yang disiapkan di sisi klien, jadi PDO tidak boleh memiliki akses ke string kueri yang digabungkan dengan parameternya.

Pernyataan SQL dikirim ke server database saat Anda melakukan persiapan(), dan parameter dikirim secara terpisah saat Anda melakukan eksekusi(). Log kueri umum MySQL memang menampilkan SQL akhir dengan nilai yang diinterpolasi setelah Anda mengeksekusi(). Di bawah ini adalah kutipan dari log kueri umum saya. Saya menjalankan kueri dari CLI mysql, bukan dari PDO, tetapi prinsipnya sama.

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

Anda juga bisa mendapatkan apa yang Anda inginkan jika Anda menyetel atribut PDO PDO::ATTR_EMULATE_PREPARES. Dalam mode ini, PDO menginterpolasi parameter ke dalam kueri SQL dan mengirimkan seluruh kueri saat Anda mengeksekusi(). Ini bukan kueri yang disiapkan dengan benar. Anda akan menghindari manfaat kueri yang disiapkan dengan menginterpolasi variabel ke dalam string SQL sebelum mengeksekusi().

Komentar ulang dari @afilina:

Tidak, kueri SQL tekstual adalah tidak dikombinasikan dengan parameter selama eksekusi. Jadi tidak ada yang bisa ditunjukkan PDO kepada Anda.

Secara internal, jika Anda menggunakan PDO::ATTR_EMULATE_PREPARES, PDO membuat salinan kueri SQL dan menginterpolasi nilai parameter ke dalamnya sebelum melakukan persiapan dan eksekusi. Tetapi PDO tidak mengekspos kueri SQL yang dimodifikasi ini.

Objek PDOStatement memiliki properti $queryString, tetapi ini hanya disetel dalam konstruktor untuk PDOStatement, dan tidak diperbarui saat kueri ditulis ulang dengan parameter.

Ini akan menjadi permintaan fitur yang masuk akal bagi PDO untuk meminta mereka mengekspos kueri yang ditulis ulang. Tetapi bahkan itu tidak akan memberi Anda kueri "lengkap" kecuali Anda menggunakan PDO::ATTR_EMULATE_PREPARES.

Inilah mengapa saya menunjukkan solusi di atas menggunakan log kueri umum server MySQL, karena dalam kasus ini bahkan kueri yang disiapkan dengan placeholder parameter ditulis ulang di server, dengan nilai parameter diisi ulang ke dalam string kueri. Tapi ini hanya dilakukan selama logging, bukan selama eksekusi query.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. akses ditolak untuk pengguna @ 'localhost' ke database ''

  2. Bagaimana saya bisa mensimulasikan variabel array di MySQL?

  3. Cara Membuat Tabel Pivot Dinamis di MySQL

  4. Cara Menampilkan Baris Tidak Ada di Tabel Lain di MySQL

  5. Plugin otentikasi 'caching_sha2_password' tidak didukung