Panduan Debug Query MySQL di PHP: Temukan Error dengan Cepat

Suatu sore, halaman daftar produk di situsmu mendadak kosong padahal data di database ada. Kamu buka phpMyAdmin, jalankan query yang sama, hasilnya muncul. Berarti masalahnya ada di kode PHP, bukan di MySQL. Menemukan letak error query seperti ini butuh cara debug yang sistematis.

1. Aktifkan Pelaporan Error di PHP

Langkah pertama, pastikan PHP benar-benar menampilkan error. Di lingkungan pengembangan, set display_errors dan error_reporting di php.ini atau lewat ini_set() di awal skrip. Tanpa ini, error bisa tertelan dan kamu hanya melihat halaman putih.

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

Di server produksi, jangan tampilkan error ke pengunjung. Cukup catat ke log dengan log_errors = On dan error_log yang bisa kamu baca nanti.

2. Periksa Koneksi Database Sebelum Menyalahkan Query

Query gagal bisa jadi karena koneksi yang putus di tengah jalan. Jika kamu memakai PDO, set atribut PDO::ATTR_ERRMODE ke PDO::ERRMODE_EXCEPTION agar setiap kesalahan melempar exception. Untuk MySQLi, gunakan mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT). Dengan begitu, kegagalan koneksi atau query tidak lewat begitu saja. Cara memilih pendekatan koneksi yang tepat sudah dibahas di panduan PDO vs MySQLi.

3. Tampilkan Pesan Error Spesifik dari Query

Setelah error reporting aktif, tangkap pesan dari driver database. Pada PDO, bungkus eksekusi dengan blok try-catch dan cetak $e->getMessage(). Pada MySQLi, periksa $stmt->error setelah execute(). Pesan seperti “You have an error in your SQL syntax” langsung menunjuk ke bagian query yang salah.

try {
    $stmt = $pdo->prepare("SELECT * FROM produk WHERE id = :id");
    $stmt->execute(['id' => $id]);
} catch (PDOException $e) {
    error_log('Query gagal: ' . $e->getMessage());
}

Jangan pernah menampilkan pesan mentah ini ke pengguna. Cukup untuk log pengembangan.

4. Cetak Query dan Bind Parameter

Kadang query terlihat benar, tapi nilai yang dikirim tidak sesuai. Tampilkan query lengkap dengan nilai parameter yang di-bind. Pada PDO, kamu bisa mengakali dengan $stmt->debugDumpParams() atau mencatat manual setiap parameter. Periksa tipe data: angka yang dikirim sebagai string bisa membuat perbandingan di MySQL tidak memakai indeks, tapi biasanya tetap berjalan. Yang lebih sering bikin gagal adalah nilai NULL atau tanda kutip yang tidak ter-escape. Jika kamu memakai prepared statement, escaping sudah ditangani, tetapi pastikan placeholder dan jumlah parameter cocok.

5. Uji Query Secara Terpisah

Salin query yang dicurigai, ganti placeholder dengan nilai asli, lalu jalankan langsung di klien MySQL seperti phpMyAdmin atau command line. Jika query berhasil di sana tetapi gagal di PHP, masalahnya ada pada cara PHP mengirim query. Periksa apakah ada karakter khusus yang terpotong, atau apakah kamu menggunakan multi_query yang tidak didukung oleh prepared statement.

6. Baca Log Error MySQL

MySQL punya log sendiri yang mencatat query lambat atau error server. Lokasinya tergantung sistem operasi, biasanya di /var/log/mysql/error.log untuk Linux. Jika query gagal karena masalah izin atau tabel tidak ada, log ini yang memberi petunjuk. Di lingkungan lokal seperti XAMPP, log bisa ditemukan di folder mysql/data dengan nama hostname.err.

7. Gunakan Alat Bantu Debug dan Profiling

Untuk proyek yang lebih besar, pertimbangkan Xdebug atau tool seperti Laravel Debugbar (jika memakai framework). Mereka bisa menampilkan query yang dijalankan beserta waktunya. Namun untuk debug cepat, teknik manual di atas sudah cukup. Yang penting, biasakan mencatat query ke file log saat pengembangan, terutama untuk query yang kompleks. Jika kamu ingin memperdalam pencegahan error sejak awal, baca juga cara mencegah SQL injection dengan prepared statement.

8. Cek Struktur Tabel dan Tipe Data

Error “Unknown column” atau “Incorrect integer value” sering muncul karena struktur tabel berubah. Bandingkan nama kolom di query dengan struktur tabel saat ini. Tipe data yang tidak cocok, misalnya memasukkan string ke kolom INT, bisa memicu error di mode strict. Jalankan DESCRIBE nama_tabel; untuk memastikan.

Ringkasan

Debug query MySQL di PHP dimulai dari memastikan error benar-benar terlihat, lalu melacak dari koneksi, eksekusi, hingga log server. Dengan kebiasaan mencatat error dan menguji query secara terpisah, kamu bisa menemukan penyebabnya lebih cepat tanpa menebak-nebak.

Pertanyaan yang Sering Diajukan

Mengapa query saya berhasil di phpMyAdmin tetapi gagal di PHP?

Biasanya karena perbedaan penanganan parameter, karakter escape, atau mode SQL yang berbeda antara klien dan koneksi PHP. Periksa juga apakah ada perbedaan user database dan hak aksesnya.

Bagaimana cara mengetahui query mana yang menyebabkan error tanpa menampilkan pesan ke pengguna?

Catat pesan error ke file log menggunakan error_log() atau konfigurasi log_errors. Dengan begitu, kamu tetap bisa melihat detailnya di server tanpa membocorkan ke publik.

Apakah error query bisa disebabkan oleh timeout koneksi?

Bisa. Koneksi yang menganggur terlalu lama dapat diputus oleh server MySQL. Set wait_timeout yang sesuai atau gunakan koneksi persisten dengan hati-hati. Periksa juga apakah ada masalah jaringan antara server web dan database.

Jika kamu ingin suasana santai sambil memantau pertandingan, terutama basket, sepakbola, atau UFC, coba tonton bareng gratis dengan host kocak di tarkamlive. Situs itu menyediakan streaming olahraga yang bisa jadi hiburan saat istirahat ngoding.