Cara Mengatasi SQLSTATE Error di PHP PDO

Error SQLSTATE di PHP PDO berarti query database gagal dijalankan dan PDO mengembalikan kode standar SQL beserta pesan detailnya. Bentuknya bisa seperti SQLSTATE[42S02], SQLSTATE[23000], atau SQLSTATE[HY000].

Walaupun terlihat menakutkan, error ini justru sangat berguna untuk debugging karena biasanya memberi petunjuk apakah masalahnya ada di koneksi, nama tabel, nama kolom, constraint database, atau query SQL itu sendiri.

Kapan Error Ini Biasanya Muncul?

  • Saat nama tabel atau kolom salah ketik
  • Saat jumlah placeholder ? tidak cocok dengan data yang dikirim
  • Saat data yang dimasukkan melanggar unique key atau foreign key
  • Saat koneksi database salah atau server MySQL tidak berjalan
  • Saat query LIMIT, OFFSET, atau tipe data dikirim dalam format yang salah

Penyebab Paling Umum

1. Nama Tabel atau Kolom Salah

<?php
$stmt = $pdo->query("SELECT * FROM produks");

Kalau tabel yang benar adalah produk, PDO biasanya mengembalikan SQLSTATE[42S02].

2. Placeholder dan Data Tidak Cocok

<?php
$stmt = $pdo->prepare("INSERT INTO users (nama, email) VALUES (?, ?, ?)");
$stmt->execute(['Rama', '[email protected]']);

Query meminta tiga nilai, tetapi data yang dikirim hanya dua.

3. Koneksi Database Bermasalah

Contohnya:

  • host salah
  • username/password salah
  • MySQL belum jalan
  • nama database belum dibuat

4. Constraint Database Dilanggar

Contoh umum:

  • email harus unik, tetapi kamu memasukkan email yang sama
  • foreign key mengacu ke data yang belum ada
  • field NOT NULL dikirim kosong

5. Query SQL Kurang Tepat

Ini sering terjadi pada:

  • LIMIT dan OFFSET tanpa PDO::PARAM_INT
  • typo sintaks SQL
  • query dinamis yang menyusun string SQL tanpa validasi

Langkah Diagnosis

  1. Baca seluruh pesan error, jangan hanya berhenti di kata SQLSTATE.
  2. Catat kode error-nya, misalnya 42S02, 23000, atau HY000.
  3. Cek query yang dijalankan dan data yang dikirim ke execute().
  4. Bandingkan nama tabel/kolom dengan schema database.
  5. Kalau error terjadi di development, tangkap exception dan tampilkan pesannya.
<?php
try {
    $stmt = $pdo->prepare("SELECT * FROM produk WHERE id = ?");
    $stmt->execute([$id]);
} catch (PDOException $e) {
    echo $e->getMessage();
}
Baca Kode Error Dulu

SQLSTATE hanyalah payung besarnya. Petunjuk utamanya ada di kode dan pesan setelahnya, misalnya Table doesn't exist, Integrity constraint violation, atau Connection refused.

Langkah Fix

1. Perbaiki Nama Tabel dan Kolom

<?php
$stmt = $pdo->query("SELECT * FROM produk");

Sebelum menjalankan query, pastikan schema database memang memakai nama itu.

2. Pastikan Jumlah Placeholder Sesuai

<?php
$stmt = $pdo->prepare("INSERT INTO users (nama, email) VALUES (?, ?)");
$stmt->execute(['Rama', '[email protected]']);

3. Gunakan bindValue() untuk Angka Tertentu

<?php
$stmt = $pdo->prepare("SELECT * FROM produk LIMIT :limit OFFSET :offset");
$stmt->bindValue(':limit', 10, PDO::PARAM_INT);
$stmt->bindValue(':offset', 0, PDO::PARAM_INT);
$stmt->execute();

4. Validasi Data Sebelum Masuk ke Database

Kalau database mewajibkan email unik atau foreign key tertentu, cek dulu dari sisi aplikasi agar error lebih mudah dijelaskan ke user.

5. Tangani Error dengan try...catch

<?php
try {
    $stmt = $pdo->prepare("INSERT INTO users (email) VALUES (?)");
    $stmt->execute([$email]);
} catch (PDOException $e) {
    error_log($e->getMessage());
    echo "Gagal menyimpan data. Cek input dan koneksi database.";
}

Contoh Sebelum dan Sesudah

Sebelum

<?php
$stmt = $pdo->prepare("SELECT * FROM buku_tamu LIMIT ? OFFSET ?");
$stmt->execute([$limit, $offset]);

Pada beberapa konfigurasi MySQL, ini bisa memicu error karena LIMIT dan OFFSET dikirim sebagai string.

Sesudah

<?php
$stmt = $pdo->prepare("SELECT * FROM buku_tamu LIMIT :limit OFFSET :offset");
$stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->execute();

Error Umum

SQLSTATE[42S02]: Base table or view not found

Biasanya nama tabel salah atau tabelnya memang belum dibuat.

SQLSTATE[23000]: Integrity constraint violation

Biasanya data melanggar aturan unique key, foreign key, atau NOT NULL.

SQLSTATE[HY000] [2002] Connection refused

Biasanya MySQL belum berjalan, host salah, atau port tidak sesuai.

SQLSTATE[42000]: Syntax error or access violation

Bisa berarti query SQL salah, nama kolom tidak valid, atau hak akses user database kurang.

Pencegahan

  1. Tulis query dengan prepared statement, bukan string gabungan sembarangan.
  2. Cocokkan schema database sebelum menulis query manual.
  3. Validasi input user sebelum dikirim ke database.
  4. Gunakan PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION agar error lebih jelas.
  5. Log error database di development dan production dengan cara yang aman.

Bacaan Terkait

FAQ

Apakah semua SQLSTATE berarti query saya salah?

Tidak. Kadang query-nya benar, tetapi koneksi database, data input, atau constraint schema yang bermasalah.

Kenapa query aman di lokal tetapi gagal di server?

Bisa karena versi MySQL berbeda, mode SQL berbeda, schema belum sinkron, atau hak akses user database di server lebih terbatas.

Apakah error SQLSTATE boleh ditampilkan ke user?

Jangan di production. Tampilkan pesan yang ramah ke user, lalu log detail teknisnya untuk developer.