Kenapa Pagination PHP Tidak Jalan? Checklist Debug
Pagination terlihat sederhana: ambil page dari URL, hitung LIMIT dan OFFSET, lalu tampilkan data. Tetapi saat implementasinya meleset sedikit saja, gejalanya langsung terasa aneh: halaman 2 isinya sama dengan halaman 1, halaman terakhir kosong, atau link next/prev malah lompat ke data yang salah.
Masalah pagination hampir selalu ada di salah satu dari tiga titik: perhitungan offset, query total data, atau pembuatan link halaman.
Kapan Masalah Ini Biasanya Muncul?
- Halaman 1 dan halaman 2 menampilkan data yang sama
- Halaman terakhir kosong padahal total data masih ada
- Tombol next/prev menuju halaman yang salah
- Nomor halaman tampil, tetapi query database tidak berubah
- Filter pencarian aktif, tetapi total halaman tetap menghitung semua data
Penyebab Paling Umum
1. Rumus OFFSET Salah
Rumus yang benar:
Kalau kamu menulis $offset = $page * $limit, halaman pertama akan langsung melewati data awal.
2. Nilai page dari URL Tidak Divalidasi
Kalau user membuka ?page=0, ?page=-2, atau ?page=abc, hasil perhitungan pagination bisa kacau kalau tidak dibersihkan.
3. Query Total Data Tidak Sama dengan Query List Data
Ini bug yang sangat sering:
Tetapi query list datanya memakai filter:
Akibatnya, jumlah halaman dihitung dari semua data, bukan dari data yang sedang difilter.
4. Link Pagination Tidak Membawa Query String Penting
Kalau user sedang mencari ?keyword=laptop&page=2, tetapi link next hanya menjadi ?page=3, filter keyword akan hilang dan isi datanya berubah.
5. Tidak Ada ORDER BY
Pagination tanpa urutan yang konsisten bisa membuat data terasa "lompat-lompat", terutama saat ada data baru masuk ke tabel.
6. Total Halaman Tidak Dibulatkan ke Atas
Gunakan ceil(), bukan pembagian biasa:
Kalau tidak, sisa data di halaman terakhir bisa hilang.
Langkah Diagnosis
- Tampilkan nilai
page,limit, danoffsetsebelum query dijalankan. - Pastikan halaman aktif minimal bernilai
1. - Bandingkan query total data dan query list data. Filter-nya harus sinkron.
- Pastikan query list memakai
ORDER BYyang stabil, misalnyaORDER BY id DESC. - Cek apakah link pagination tetap membawa query string lain seperti
keyword,sort, ataukategori.
Kalau pagination terasa aneh, cek dulu tiga nilai berikut: page, limit, dan offset. Biasanya bug-nya langsung kelihatan dari sana.
Langkah Fix
1. Bersihkan Nilai page
2. Hitung OFFSET dengan Rumus yang Benar
3. Sinkronkan Query Total dan Query Data
4. Bawa Query String Saat Membuat Link
5. Batasi Halaman Maksimum
Kalau user meminta ?page=999, lebih aman dibatasi:
Contoh Sebelum dan Sesudah
Sebelum
Masalahnya:
OFFSETsalah- tidak ada validasi halaman
- tidak ada
ORDER BY
Sesudah
Error Umum
Halaman 2 Isinya Sama dengan Halaman 1
Biasanya OFFSET tidak berubah atau rumusnya salah.
Halaman Terakhir Kosong
Sering terjadi karena:
- total halaman dihitung dari query yang berbeda
- user membuka nomor halaman di luar batas
- hasil
COUNT(*)tidak memakai filter yang sama
Nomor Halaman Sudah Benar, Tetapi Data Tetap Lompat
Kemungkinan query belum memakai ORDER BY, sehingga database bebas mengurutkan hasil.
Pencegahan
- Selalu bersihkan
$_GET['page']denganmax(1, ...). - Gunakan
ORDER BYyang stabil di semua query pagination. - Hitung total data dengan filter yang sama persis.
- Pakai
ceil()untuk menghitung total halaman. - Simpan query string penting saat membangun link pagination.
Bacaan Terkait
- Pagination
- SQL Lebih Dalam
- Cara Mengatasi Undefined Array Key di PHP
- Prepared Statement PHP Error: Penyebab dan Solusi
FAQ
Kenapa pagination saya jalan di halaman awal, tetapi error saat ada filter?
Biasanya query COUNT(*) dan query list data tidak memakai WHERE yang sama.
Kenapa LIMIT dan OFFSET saya error saat pakai prepared statement?
Beberapa kasus butuh bindValue(..., PDO::PARAM_INT) agar nilainya benar-benar dikirim sebagai integer.
Perlukah membatasi page maksimum?
Iya. Ini mencegah user membuka halaman di luar batas dan mengurangi kasus tampilan kosong yang membingungkan.