Sebelum pindah ke PDO, saya membuat query SQL di PHP dengan merangkai string. Jika saya mendapat kesalahan sintaksis basis data, saya bisa menggaungkan string kueri SQL final, coba sendiri di database, dan atur sampai saya memperbaiki kesalahan, kemudian masukkan kembali ke dalam kode.
Pernyataan PDO yang disiapkan lebih cepat dan lebih baik dan lebih aman, tetapi satu hal yang menggangguku: Saya tidak pernah melihat permintaan terakhir karena dikirim ke database. Ketika saya mendapatkan kesalahan tentang sintaks di log Apache saya atau file log kustom saya (saya mencatat kesalahan di dalam catch
blok), saya tidak bisa melihat permintaan yang menyebabkannya.
Apakah ada cara menangkap kueri SQL lengkap yang dikirim oleh PDO ke database dan mencatatnya ke file?
/var/log/mysql/*
. Parameter terikat PDO tidak dapat menyebabkan kesalahan sintaks sehingga yang Anda butuhkan adalah kueri SQL yang disiapkan.var_dump($pdo_instance->debugDumpParams())
Jawaban:
Anda mengatakan ini:
Sebenarnya, ketika menggunakan pernyataan yang disiapkan, tidak ada yang namanya " permintaan akhir " :
Jadi, untuk menjawab pertanyaanmu :
Tidak: karena tidak ada " permintaan SQL lengkap " di mana saja, tidak ada cara untuk menangkapnya.
Hal terbaik yang dapat Anda lakukan, untuk tujuan debugging, adalah "membangun kembali" sebuah query SQL "nyata", dengan menyuntikkan nilai-nilai ke dalam string SQL pernyataan.
Apa yang biasanya saya lakukan, dalam situasi seperti ini, adalah:
var_dump
(atau yang setara) setelahnya, untuk menampilkan nilai-nilai parameterIni tidak bagus, ketika datang untuk debugging - tapi itu harga pernyataan yang disiapkan dan keuntungan yang mereka bawa.
sumber
Mencari di log basis data
Meskipun Pascal MARTIN benar bahwa PDO tidak mengirim permintaan lengkap ke database sekaligus, saran ryeguy untuk menggunakan fungsi logging DB benar-benar memungkinkan saya untuk melihat permintaan lengkap yang dikumpulkan dan dieksekusi oleh database.
Begini caranya: (Instruksi ini untuk MySQL pada mesin Windows - jarak tempuh Anda mungkin beragam)
my.ini
, di bawah[mysqld]
bagian, tambahkanlog
perintah, sepertilog="C:\Program Files\MySQL\MySQL Server 5.1\data\mysql.log"
File itu akan tumbuh dengan cepat, jadi pastikan untuk menghapusnya dan mematikan pencatatan ketika Anda selesai menguji.
sumber
PDO::ATTR_EMULATE_PREPARES
. Lihat jawaban ini untuk info lebih lanjut: stackoverflow.com/questions/10658865/#answer-10658929general_log
bukanlog
. Lihat dev.mysql.com/doc/refman/5.5/en/query-log.htmlTentu Anda dapat men-debug menggunakan mode ini.
{{ PDO::ATTR_ERRMODE }}
Cukup tambahkan baris baru sebelum permintaan Anda, maka Anda akan menunjukkan garis debug.sumber
->query
saat menggunakan pernyataan yang disiapkan?Mungkin yang ingin Anda lakukan adalah menggunakan debugDumpParams () pada pernyataan pegangan. Anda dapat menjalankannya kapan saja setelah mengikat nilai ke kueri yang disiapkan (tidak perlu
execute()
pernyataan).Itu tidak membangun pernyataan yang disiapkan untuk Anda, tetapi itu akan menunjukkan parameter Anda.
sumber
Posting lama tapi mungkin seseorang akan menganggap ini berguna;
sumber
Berikut adalah fungsi untuk melihat apa SQL yang efektif akan, diadaptasi dari komentar oleh "Mark" di php.net :
sumber
str_replace(":$k" ....
? Indeks asosiatif sudah memilikinya dalam array $ params.:name_long
dengan:name
. Setidaknya jika:name
datang sebelumnya:name_long
. Pernyataan disiapkan MySQL dapat menangani ini dengan benar, jadi jangan biarkan itu membingungkan Anda.Tidak. Pertanyaan PDO tidak disiapkan di sisi klien. PDO hanya mengirim kueri SQL dan parameter ke server database. Basis data adalah apa yang substitusi (dari
?
). Anda memiliki dua opsi:sumber
hampir tidak ada yang dikatakan tentang menampilkan kesalahan kecuali memeriksa log kesalahan, tetapi ada fungsi yang cukup membantu:
( tautan sumber )
jelas bahwa kode ini dapat dimodifikasi untuk digunakan sebagai pesan pengecualian atau jenis penanganan kesalahan lainnya
sumber
misalnya Anda memiliki pernyataan pdo ini:
sekarang Anda bisa mendapatkan kueri yang dieksekusi dengan mendefinisikan array seperti ini:
sumber
));
seharusnya);
(hanya satu putaran braket).Mencari di internet saya menemukan ini sebagai solusi yang dapat diterima. Kelas yang berbeda digunakan sebagai ganti fungsi PDO dan PDO dipanggil melalui panggilan fungsi sulap. Saya tidak yakin ini menciptakan masalah kinerja yang serius. Tapi itu bisa digunakan sampai fitur logging masuk akal ditambahkan ke PDO.
Jadi sesuai utas ini , Anda bisa menulis pembungkus untuk koneksi PDO Anda yang bisa login dan melempar pengecualian ketika Anda mendapatkan kesalahan.
Ini adalah contoh sederhana:
jadi Anda bisa menggunakan kelas itu alih-alih PDOStatement:
Berikut implementasi dekorator PDO yang disebutkan:
sumber
Untuk login MySQL di WAMP , Anda perlu mengedit my.ini (mis. Di bawah wamp \ bin \ mysql \ mysql5.6.17 \ my.ini)
dan tambahkan ke
[mysqld]
:sumber
Ini adalah fungsi yang saya buat untuk mengembalikan query SQL dengan parameter "diselesaikan".
Dengan asumsi Anda mengeksekusi seperti ini
Fungsi ini TIDAK menambahkan kutipan ke pertanyaan tetapi melakukan pekerjaan untuk saya.
sumber
Masalah yang saya miliki dengan solusi untuk menangkap pengecualian PDO untuk tujuan debug adalah bahwa ia hanya menangkap pengecualian PDO (duh), tetapi tidak menangkap kesalahan sintaks yang terdaftar sebagai kesalahan php (saya tidak yakin mengapa ini, tapi " mengapa "tidak relevan dengan solusi). Semua panggilan PDO saya berasal dari kelas model tabel tunggal yang saya perpanjang untuk semua interaksi saya dengan semua tabel ... ini hal yang rumit ketika saya mencoba untuk men-debug kode, karena kesalahan akan mendaftarkan baris kode php di mana panggilan eksekusi saya menelepon, tetapi tidak memberi tahu saya dari mana panggilan itu, sebenarnya, dibuat. Saya menggunakan kode berikut untuk mengatasi masalah ini:
Jadi, kode di atas menangkap KEDUA PDO pengecualian DAN kesalahan sintaks php dan memperlakukan mereka dengan cara yang sama. Penangan kesalahan saya terlihat seperti ini:
Jika ada yang punya ide yang lebih baik tentang cara mendapatkan info yang relevan untuk penangan kesalahan saya daripada menetapkan model tabel sebagai variabel global, saya akan senang mendengarnya dan mengedit kode saya.
sumber
kode ini sangat bagus untuk saya:
Jangan lupa mengganti $ data dan $ query dengan nama Anda
sumber
saya menggunakan kelas ini untuk men-debug PDO (dengan Log4PHP )
sumber
Saya telah membuat proyek / repositori yang memuat Komposer modern untuk hal ini di sini:
pdo-debug
Temukan rumah GitHub proyek di sini , lihat posting blog yang menjelaskannya di sini . Satu baris untuk ditambahkan di composer.json Anda, dan kemudian Anda dapat menggunakannya seperti ini:
$ sql adalah pernyataan SQL mentah, $ parameter adalah array dari parameter Anda: Kuncinya adalah nama placeholder (": user_id") atau jumlah parameter yang tidak disebutkan namanya ("?"), nilainya .. yah, nilai.
Logika di belakang: Script ini hanya akan grad parameter dan menggantinya ke string SQL yang disediakan. Sangat sederhana, tetapi sangat efektif untuk 99% kasus penggunaan Anda. Catatan: Ini hanya emulasi dasar, bukan debugging PDO nyata (karena ini tidak mungkin karena PHP mengirim SQL mentah dan parameter ke server MySQL terpisah).
Terima kasih banyak kepada bigwebguy dan Mike dari utas StackOverflow. Mendapatkan string kueri SQL mentah dari PDO karena pada dasarnya menulis seluruh fungsi utama di belakang skrip ini. Besar!
sumber
Bagaimana cara men-debug query database mysql PDO di Ubuntu
TL; DR Log semua pertanyaan Anda dan ikuti log mysql.
Petunjuk ini adalah untuk saya menginstal Ubuntu 14.04. Perintah
lsb_release -a
mengeluarkan untuk mendapatkan versi Anda. Pemasangan Anda mungkin berbeda.Aktifkan masuk log mysql
cd /etc/mysql
. Anda akan melihat file bernamamy.cnf
. Itu file yang akan kita ubah.cat my.cnf | grep general_log
. Ini memfiltermy.cnf
file untuk Anda. Anda akan melihat dua entri:#general_log_file = /var/log/mysql/mysql.log
&&#general_log = 1
.sudo service mysql restart
.sudo service nginx restart
.Kerja bagus! Anda sudah siap. Sekarang yang harus Anda lakukan adalah mengekor file log sehingga Anda dapat melihat permintaan PDO yang dibuat aplikasi Anda secara waktu nyata.
Ekor log untuk melihat kueri Anda
Masukkan cmd ini
tail -f /var/log/mysql/mysql.log
.Output Anda akan terlihat seperti ini:
Setiap kueri baru yang dibuat aplikasi Anda akan muncul secara otomatis , selama Anda melanjutkan membuntuti log. Untuk keluar dari ekor, tekan
cmd/ctrl c
.Catatan
truncate --size 0 mysql.log
.Kredit & terima kasih
Huge berteriak untuk jawaban Nathan Long di atas untuk inspirasi untuk mencari tahu ini di Ubuntu. Juga untuk dikirill untuk komentarnya pada posting Nathan yang membawa saya ke solusi ini.
Love you stackoverflow!
sumber
Di lingkungan Debian NGINX saya melakukan hal berikut.
Goto
/etc/mysql/mysql.conf.d
mengeditmysqld.cnf
jika Anda menemukanlog-error = /var/log/mysql/error.log
menambahkan 2 baris berikut melenguh itu.Untuk melihat log goto
/var/log/mysql
dantail -f mysql.log
Ingatlah untuk mengomentari baris-baris ini setelah Anda selesai dengan debugging jika Anda berada dalam lingkungan produksi hapus
mysql.log
karena file log ini akan tumbuh dengan cepat dan bisa sangat besar.sumber