Bayangkan menampilkan 5.000 data produk dalam satu halaman — lambat dimuat dan melelahkan untuk digulir. Solusinya adalah pagination: membagi data menjadi beberapa halaman, misalnya 10 data per halaman, lengkap dengan navigasi angka di bawahnya. Tutorial ini membahas cara membuat pagination PHP MySQL dari nol dengan kode lengkap.

Konsep Dasar: LIMIT dan OFFSET
Pagination memanfaatkan dua klausa SQL:
LIMIT— berapa banyak baris yang diambil (misalnya 10).OFFSET— melewati berapa baris dari awal.
Contoh: halaman 1 → LIMIT 10 OFFSET 0, halaman 2 → LIMIT 10 OFFSET 10, halaman 3 → LIMIT 10 OFFSET 20. Rumus offset: (halaman - 1) × jumlah_per_halaman.
Langkah 1: Persiapan Data
Gunakan tabel apa saja, misalnya mahasiswa berisi banyak baris. Koneksi seperti biasa:
<?php
$koneksi = new mysqli("localhost", "root", "", "latihan");
if ($koneksi->connect_error) {
die("Koneksi gagal: " . $koneksi->connect_error);
}
?>
Langkah 2: Menghitung Halaman
<?php
require "koneksi.php";
$per_halaman = 10;
// Halaman aktif (default 1), dipaksa jadi angka positif
$halaman = isset($_GET["hal"]) ? (int) $_GET["hal"] : 1;
if ($halaman < 1) $halaman = 1;
// Hitung total data & total halaman
$total = $koneksi->query("SELECT COUNT(*) AS jml FROM mahasiswa")->fetch_assoc()["jml"];
$total_halaman = ceil($total / $per_halaman);
// Hitung offset
$offset = ($halaman - 1) * $per_halaman;
?>
ceil() membulatkan ke atas — jika ada 25 data dengan 10 per halaman, hasilnya 3 halaman (bukan 2,5).
Langkah 3: Mengambil Data per Halaman
Gunakan prepared statement agar aman, dengan LIMIT dan OFFSET sebagai parameter:
<?php
$stmt = $koneksi->prepare("SELECT * FROM mahasiswa ORDER BY id DESC LIMIT ? OFFSET ?");
$stmt->bind_param("ii", $per_halaman, $offset);
$stmt->execute();
$hasil = $stmt->get_result();
?>
Langkah 4: Menampilkan Data
<table border="1" cellpadding="8">
<tr><th>NIM</th><th>Nama</th><th>Jurusan</th></tr>
<?php while ($row = $hasil->fetch_assoc()): ?>
<tr>
<td><?= htmlspecialchars($row["nim"]) ?></td>
<td><?= htmlspecialchars($row["nama"]) ?></td>
<td><?= htmlspecialchars($row["jurusan"]) ?></td>
</tr>
<?php endwhile; ?>
</table>
Langkah 5: Navigasi Nomor Halaman
Bagian ini membuat deretan angka halaman yang bisa diklik:
<div class="pagination">
<?php if ($halaman > 1): ?>
<a href="?hal=<?= $halaman - 1 ?>">« Sebelumnya</a>
<?php endif; ?>
<?php for ($i = 1; $i <= $total_halaman; $i++): ?>
<?php if ($i == $halaman): ?>
<strong><?= $i ?></strong>
<?php else: ?>
<a href="?hal=<?= $i ?>"><?= $i ?></a>
<?php endif; ?>
<?php endfor; ?>
<?php if ($halaman < $total_halaman): ?>
<a href="?hal=<?= $halaman + 1 ?>">Berikutnya »</a>
<?php endif; ?>
</div>
Tautan memakai ?hal= pada URL. Saat diklik, halaman dimuat ulang dengan nomor baru, dan offset dihitung ulang otomatis.
Kesalahan Umum
- Menyisipkan
$_GET["hal"]langsung ke query — rawan SQL injection. Paksa(int)dan gunakan prepared statement. - Lupa
ceil()— total halaman salah sehingga sebagian data tak tampil. - Offset negatif — jika
halbernilai 0 atau minus; pastikan minimal 1. - Menghitung total dengan mengambil semua baris — gunakan
COUNT(*)yang jauh lebih efisien.
Kesimpulan
Anda telah membuat pagination PHP MySQL lengkap dengan LIMIT, OFFSET, dan navigasi halaman. Teknik ini wajib untuk aplikasi dengan data banyak agar tetap cepat dan nyaman. Untuk pengembangan, tambahkan fitur pencarian yang tetap mempertahankan pagination, atau tampilkan rentang halaman terbatas (misalnya 1 2 3 … 10) untuk data yang sangat banyak.
Referensi: untuk penjelasan fungsi lebih mendalam, kunjungi dokumentasi resmi PHP (php.net).

