- Part 1: Setup & Menampilkan Data
- Part 2: CRUD (Tambah, Edit, Hapus)
- Part 3: Pencarian & Pagination
- Part 4: Login & Session (sedang dibaca)
Selamat datang di bagian terakhir seri PHP native. Dari Part 1 hingga Part 3, kita membangun aplikasi data alumni lengkap dengan CRUD, pencarian, dan pagination. Tapi ada celah keamanan: siapa pun bisa membuka URL dan mengelola data. Di Part 4 ini kita bangun sistem login dengan PHP native dan session.

Bagaimana Login Bekerja
Alurnya: pengguna mengisi form login, sistem memverifikasi username dan password terhadap database, jika cocok status login disimpan di session, lalu setiap halaman yang dilindungi memeriksa session tersebut di awal skrip. Mari kita bangun bertahap.
Membuat Tabel User
Buat tabel user di database db_alumni:
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT,
nama VARCHAR(80),
username VARCHAR(40) UNIQUE,
password VARCHAR(255)
);
Kolom password dibuat panjang (255) karena kita menyimpan hash, bukan teks asli.
Membuat Akun Admin
Jangan pernah menyimpan password apa adanya. Buat hash dengan password_hash(). Jalankan skrip kecil sekali saja untuk menghasilkan hash:
<?php
echo password_hash('rahasia123', PASSWORD_DEFAULT);
// salin hasilnya ke query INSERT di bawah
Lalu masukkan ke database (ganti nilai hash dengan hasil di atas):
INSERT INTO user (nama, username, password) VALUES
('Administrator', 'admin', '$2y$10$contohhashyangdihasilkan');
Membuat Halaman Login
Buat file login.php yang menampilkan form sekaligus memproses login:
<?php
session_start();
require 'config/koneksi.php';
$error = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$username = trim($_POST['username']);
$password = $_POST['password'];
$stmt = $pdo->prepare("SELECT * FROM user WHERE username = ?");
$stmt->execute([$username]);
$user = $stmt->fetch();
if ($user && password_verify($password, $user['password'])) {
$_SESSION['login'] = true;
$_SESSION['id_user'] = $user['id'];
$_SESSION['nama'] = $user['nama'];
header('Location: index.php');
exit;
} else {
$error = 'Username atau password salah.';
}
}
?>
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<title>Login - Data Alumni</title>
<link rel="stylesheet" href="/alumni/assets/gaya.css">
</head>
<body>
<div class="kotak-login">
<h2>Login Admin</h2>
<?php if ($error): ?>
<div class="kotak-error"><?= $error ?></div>
<?php endif ?>
<form method="post">
<label>Username</label>
<input type="text" name="username">
<label>Password</label>
<input type="password" name="password">
<button type="submit" class="tombol">Login</button>
</form>
</div>
</body>
</html>
Fungsi password_verify() membandingkan password yang diketik dengan hash di database — cara aman memeriksa password tanpa pernah menyimpannya secara terbuka.

Membuat Penjaga Halaman (cek_login.php)
Agar tidak menulis pengecekan berulang di setiap file, buat satu file penjaga cek_login.php:
<?php
session_start();
if (empty($_SESSION['login'])) {
header('Location: login.php');
exit;
}
File ini sangat sederhana: jika session login tidak ada, pengguna langsung dialihkan ke halaman login.
Melindungi Halaman
Sekarang lindungi setiap halaman yang butuh login (index.php, tambah.php, edit.php, hapus.php) dengan menyisipkan penjaga di baris paling atas — menggantikan session_start() yang lama:
<?php require 'cek_login.php'; // wajib login require 'config/koneksi.php'; // ... sisa kode halaman ...
Karena cek_login.php sudah memanggil session_start(), kita tidak perlu memanggilnya lagi. Kini seluruh halaman aplikasi hanya bisa diakses setelah login.

Menampilkan Nama Admin dan Tombol Logout
Perbarui templates/header.php untuk menampilkan status login:
<nav>
<a href="/alumni/index.php">Daftar Alumni</a>
<?php if (!empty($_SESSION['login'])): ?>
<span>Halo, <?= htmlspecialchars($_SESSION['nama']) ?></span>
<a href="/alumni/logout.php">Logout</a>
<?php endif ?>
</nav>
Membuat Logout
Terakhir, buat logout.php untuk menghapus session:
<?php
session_start();
session_unset();
session_destroy();
header('Location: login.php');
exit;
Menguji Alur Login
- Buka
index.phptanpa login → dialihkan kelogin.php. - Masuk dengan username
admindan passwordrahasia123→ berhasil. - Coba password salah → muncul pesan “Username atau password salah.”
- Klik Logout → session dihapus, kembali ke login.
Catatan Keamanan
- Selalu hash password dengan
password_hash(), jangan simpan teks asli. - Selalu pakai prepared statement untuk query yang melibatkan input pengguna.
- Selalu
htmlspecialchars()saat menampilkan data ke HTML. - Untuk keamanan lebih, pertimbangkan menambahkan token CSRF pada form.
Penutup Seri
Selamat! Anda telah menyelesaikan seri lengkap membangun aplikasi data alumni dengan PHP native — dari setup dan menampilkan data (Part 1), CRUD (Part 2), pencarian dan pagination (Part 3), hingga login (Part 4). Anda kini memahami fondasi cara kerja aplikasi web PHP tanpa framework, ilmu yang membuat Anda lebih percaya diri saat nanti memakai framework seperti Laravel atau CodeIgniter.
Langkah selanjutnya bisa Anda kembangkan: ekspor data ke Excel/PDF, upload foto alumni, hak akses bertingkat, atau grafik statistik alumni. Selamat berkarya dan teruslah belajar!
Referensi: untuk pendalaman lebih lanjut, kunjungi manual resmi PHP.

