- Part 1: Setup & Menampilkan Data
- Part 2: CRUD (Tambah, Edit, Hapus)
- Part 3: Pencarian & Pagination (sedang dibaca)
- Part 4: Login & Session
Di Part 2, aplikasi data alumni sudah bisa CRUD penuh. Ketika data mencapai ratusan, kita butuh pencarian agar mudah menemukan alumni, dan pagination agar halaman tidak berat. Di Part 3 ini kita bangun keduanya dengan PHP native — tanpa library, murni memahami logikanya.

Yang Akan Kita Bangun
- Kotak pencarian untuk mencari alumni berdasarkan nama atau NIM.
- Pagination yang memecah data, misalnya 5 alumni per halaman, dengan kata kunci tetap terjaga saat pindah halaman.
Konsep Pagination Manual
Pagination di PHP native mengandalkan dua hal: klausa SQL LIMIT dan OFFSET. LIMIT membatasi jumlah baris per halaman, sedangkan OFFSET menentukan dari baris ke berapa data diambil. Rumusnya: OFFSET = (halaman - 1) × jumlah_per_halaman. Kita juga perlu menghitung total data untuk mengetahui jumlah halaman.
Menambahkan Kotak Pencarian
Tambahkan form pencarian di atas tabel pada index.php. Kita pakai metode GET agar kata kunci tersimpan di URL:
<form method="get" action="index.php" class="form-cari">
<input type="text" name="cari" value="<?= htmlspecialchars($_GET['cari'] ?? '') ?>"
placeholder="Cari nama atau NIM...">
<button type="submit">Cari</button>
</form>
Logika Pencarian dan Pagination di index.php
Inilah inti Part 3. Perbarui bagian atas index.php (sebelum menampilkan tabel):
<?php
session_start();
require 'config/koneksi.php';
// --- Pencarian ---
$cari = trim($_GET['cari'] ?? '');
$where = '';
$params = [];
if ($cari !== '') {
$where = "WHERE nama LIKE ? OR nim LIKE ?";
$params = ["%$cari%", "%$cari%"];
}
// --- Hitung total data ---
$stmt = $pdo->prepare("SELECT COUNT(*) FROM alumni $where");
$stmt->execute($params);
$total = $stmt->fetchColumn();
// --- Pagination ---
$per_halaman = 5;
$jml_halaman = ceil($total / $per_halaman);
$halaman = max(1, (int) ($_GET['halaman'] ?? 1));
$offset = ($halaman - 1) * $per_halaman;
// --- Ambil data sesuai halaman ---
$sql = "SELECT * FROM alumni $where ORDER BY id DESC LIMIT $per_halaman OFFSET $offset";
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
$alumni = $stmt->fetchAll();
require 'templates/header.php';
?>
Catatan penting: nilai $per_halaman dan $offset aman dimasukkan langsung ke query karena sudah kita paksa menjadi integer. Nilai pencarian ($cari) tetap lewat prepared statement agar aman dari SQL injection.

Menampilkan Navigasi Halaman
Di bawah tabel, buat tautan halaman. Perhatikan bagaimana kita mempertahankan kata kunci pencarian di setiap link:
<div class="paginasi">
<?php for ($i = 1; $i <= $jml_halaman; $i++): ?>
<?php $url = 'index.php?halaman=' . $i . '&cari=' . urlencode($cari); ?>
<?php if ($i == $halaman): ?>
<span class="aktif"><?= $i ?></span>
<?php else: ?>
<a href="<?= $url ?>"><?= $i ?></a>
<?php endif ?>
<?php endfor ?>
</div>
Bagian '&cari=' . urlencode($cari) inilah yang membuat pencarian tidak hilang saat pindah halaman. Fungsi urlencode() mengamankan kata kunci yang mengandung spasi atau karakter khusus.

Mempercantik Tampilan Pagination
.paginasi {
display: flex;
gap: 6px;
margin-top: 16px;
}
.paginasi a, .paginasi span {
display: inline-block;
padding: 8px 14px;
border: 1px solid #ddd;
border-radius: 6px;
text-decoration: none;
color: #6d78b6;
}
.paginasi span.aktif {
background-color: #6d78b6;
color: #fff;
border-color: #6d78b6;
}
Menangani Hasil Kosong
<?php if (empty($alumni)): ?>
<p class="kosong">Tidak ada alumni yang cocok dengan pencarian Anda.</p>
<?php else: ?>
<!-- tampilkan tabel di sini -->
<?php endif ?>
Menampilkan Info Jumlah Data
<p>Menampilkan halaman <?= $halaman ?> dari <?= $jml_halaman ?> (total <?= $total ?> alumni).</p>
Contoh Kasus Nyata
Bayangkan database alumni sebuah kampus dengan 5.000 lulusan. Tanpa pagination, satu query menarik seluruh data dan browser harus merender ribuan baris — lambat dan boros. Dengan pagination LIMIT 20, server hanya mengambil 20 baris per permintaan, dan admin bisa langsung menemukan alumni tertentu lewat kotak pencarian. Memahami cara kerjanya di PHP native membuat Anda lebih paham “keajaiban” pagination yang otomatis di framework.
Penutup
Aplikasi data alumni Anda kini dilengkapi pencarian dan pagination yang bekerja sama, dibangun sepenuhnya dengan PHP native. Anda memahami logika di baliknya — sesuatu yang sering tersembunyi di balik framework.
Namun ada satu celah: siapa saja bisa mengelola data. Di Part 4 pamungkas, kita bangun sistem login agar hanya admin terdaftar yang bisa mengakses. Sampai jumpa!
Referensi: untuk pendalaman lebih lanjut, kunjungi manual resmi PHP.

