Kami menggunakan Doctrine, sebuah ORM PHP. Saya membuat kueri seperti ini:
$q = Doctrine_Query::create()->select('id')->from('MyTable');
dan kemudian dalam fungsi saya menambahkan berbagai klausa mana dan hal-hal yang sesuai, seperti ini
$q->where('normalisedname = ? OR name = ?', array($string, $originalString));
Kemudian, sebelum execute()
-ing objek permintaan itu, saya ingin mencetak SQL mentah untuk memeriksanya, dan lakukan ini:
$q->getSQLQuery();
Namun itu hanya mencetak pernyataan yang disiapkan, bukan permintaan penuh. Saya ingin melihat apa yang dikirimkannya ke MySQL, tetapi sebaliknya ia mencetak pernyataan yang sudah disiapkan, termasuk ?
. Apakah ada cara untuk melihat kueri 'lengkap'?
Jawaban:
Doctrine tidak mengirim "permintaan SQL nyata" ke server database: itu sebenarnya menggunakan pernyataan yang disiapkan, yang berarti:
$query->getSql()
)$query->getParameters()
)Ini berarti tidak pernah ada permintaan SQL "nyata" di sisi PHP - jadi, Doktrin tidak dapat menampilkannya.
sumber
$query->getParameters();
TIDAK akan mengembalikan parameter dalam urutan yang benar, karena akan muncul dalam pernyataan permintaan yang disiapkanContoh kerja:
sumber
Anda dapat memeriksa kueri yang dieksekusi oleh aplikasi Anda jika Anda mencatat semua pertanyaan di mysql:
http://dev.mysql.com/doc/refman/5.1/en/query-log.html
akan ada lebih banyak pertanyaan tidak hanya yang Anda cari tetapi Anda dapat menangkapnya.
tapi biasanya
->getSql();
berhasilEdit:
untuk melihat semua permintaan mysql yang saya gunakan
dan tambahkan 2 baris itu:
dan mulai kembali mysql
sumber
Saya telah membuat Logger Doctrine2 yang melakukan ini. Ini "menghidrasi" kueri sql parametrized dengan nilai menggunakan konversi tipe data Doctrine 2 sendiri.
Contoh Penggunaan :; Kedamaian kode berikut akan menggemakan output standar setiap INSERT, UPDATE, DELETE kalimat SQL yang dihasilkan dengan $ em Entity Manager,
sumber
getSqlQuery()
secara teknis menunjukkan seluruh perintah SQL, tetapi jauh lebih berguna ketika Anda dapat melihat parameternya juga.Untuk membuat pola ini lebih dapat digunakan kembali, ada pendekatan bagus yang dijelaskan dalam komentar di Raw SQL dari Doctrine Query Object .
sumber
$q
. Tampaknya bukan kueri atau pembuat kueri.$q
dalam hal ini adalah kueri Ajaran 1. Anda mungkin menggunakan Doctrine 2, dalam hal ini Anda akan menginginkan sesuatu seperti$qb = $this->createQueryBuilder('a'); $q = $qb->getQuery(); $sql = $q->getSQL(); $params = $q->getParameters();
Semoga bermanfaat!Tidak ada permintaan nyata lainnya, ini adalah bagaimana pernyataan disiapkan bekerja. Nilai-nilai terikat di server basis data, bukan di lapisan aplikasi.
Lihat jawaban saya untuk pertanyaan ini: Dalam PHP dengan PDO, bagaimana cara memeriksa kueri parametrized SQL final?
(Diulang di sini untuk kenyamanan :)
sumber
Solusi saya:
Contoh penggunaan:
sumber
Anda dapat dengan mudah mengakses parameter SQL menggunakan pendekatan berikut.
Jadi, jika Anda mencetak
$param_values
dan$col_names
, Anda bisa mendapatkan nilai parameter melewati sql dan nama kolom masing-masing.Catatan: Jika
$param
mengembalikan array, Anda harus mengulanginya, karena parameter di dalamIN (:?)
biasanya datang sebagai array bersarang.Sementara itu jika Anda menemukan pendekatan lain, silakan berbaik hati untuk berbagi dengan kami :)
Terima kasih!
sumber
Solusi yang lebih jelas:
sumber
sumber
Kamu bisa memakai :
Jika Anda menggunakan MySQL, Anda bisa menggunakan Workbench untuk melihat menjalankan pernyataan SQL. Anda juga dapat menggunakan tampilan kueri yang berjalan dari mysql dengan menggunakan yang berikut ini:
sumber
Mungkin ini bisa bermanfaat bagi seseorang:
sumber
TL; DR
dalam file ranting Anda, gunakan filter pembantu ranting Doctrine:
Penjelasan:
Jawaban lain yang menyebutkan bahwa pernyataan Disiapkan sebenarnya "permintaan nyata" benar, tetapi mereka tidak menjawab harapan penanya yang jelas ... Setiap pengembang ingin menampilkan "kueri runnable" untuk debugging (atau untuk menampilkannya kepada pengguna) .
Jadi, saya melihat ke sumber profiler Symfony untuk melihat bagaimana mereka melakukannya. Bagian Doktrin adalah tanggung jawab Doktrin sehingga mereka membuat kumpulan doktrin untuk diintegrasikan dengan Symfony. Setelah melihat
doctrine-bundle/Resources/views/Collector/db.html.twig
file tersebut, Anda akan mengetahui bagaimana mereka melakukannya (ini dapat berubah antar versi). Menariknya, mereka membuat filter ranting yang dapat kita gunakan kembali (lihat di atas).Agar semuanya berfungsi, kita perlu mengaktifkan Logging untuk permintaan kita. Ada beberapa cara untuk melakukan ini dan di sini saya menggunakan DebugStack yang memungkinkan untuk mencatat permintaan tanpa benar-benar mencetaknya. Ini juga memastikan bahwa ini akan berfungsi dalam mode produksi jika ini yang Anda butuhkan ...
Jika Anda membutuhkan pemformatan lebih lanjut, Anda akan melihat bahwa mereka menyertakan beberapa CSS dalam tag gaya, jadi cukup "curi" itu ^^:
Semoga, ini akan membantu ;-)
sumber
Saya menulis logger sederhana, yang dapat mencatat permintaan dengan parameter yang dimasukkan. Instalasi:
Pemakaian:
sumber
sumber
Modifikasi @dsamblas berfungsi ketika parameter adalah string tanggal seperti ini '2019-01-01' dan ketika ada array yang dilewatkan menggunakan IN seperti
. Jadi lakukan semua yang ditulis dsamblas, tetapi ganti startQuery dengan yang ini atau lihat perbedaannya dan tambahkan kode saya. (kalau-kalau dia memodifikasi sesuatu dalam fungsinya dan versi saya tidak memiliki modifikasi).
Tidak banyak tes.
sumber
Saya membuat beberapa riset untuk topik ini, karena saya ingin men-debug query SQL yang dihasilkan dan menjalankannya di editor sql. Seperti yang terlihat di semua jawaban, ini adalah topik yang sangat teknis.
Ketika saya berasumsi bahwa pertanyaan awal didasarkan pada dev-env, satu jawaban yang sangat sederhana hilang pada saat ini. Anda bisa menggunakan build di profiler Symfony. Cukup klik pada Tab Doctrine, Gulir ke kueri yang ingin Anda periksa. Kemudian klik pada "view runnable query" dan Anda dapat menempelkan kueri Anda langsung di editor SQL Anda
Lebih banyak pendekatan berbasis UI tetapi sangat cepat dan tanpa overhead kode debug.
sumber
sumber
Untuk mencetak kueri SQL di Doctrine, gunakan:
sumber