Cara Membuat Login dengan PHP dan MySQL (Lengkap + Session)

Sistem login adalah gerbang hampir setiap aplikasi web: dari dashboard admin, toko online, hingga sistem informasi sekolah. Pada tutorial ini kita akan membuat sistem login dengan PHP dan MySQL yang tidak sekadar berjalan, tetapi juga aman — menggunakan password_hash(), prepared statement, dan session yang benar. Semua kode ditulis lengkap dan dijelaskan baris per baris agar mudah diikuti pemula.

Apa yang Akan Kita Buat

Kita akan membangun alur login sederhana namun lengkap:

  • Halaman login dengan form username & password.
  • Verifikasi ke database, lalu menyimpan status login ke session.
  • Halaman dashboard yang hanya bisa diakses setelah login.
  • Fitur logout.
Diagram alur sistem login PHP dan MySQL
Diagram alur sistem login PHP dan MySQL

Persiapan

Anda memerlukan XAMPP (atau Laragon) yang sudah menjalankan Apache dan MySQL, serta pemahaman dasar PHP. Buat folder proyek, misalnya htdocs/login-app/.

Langkah 1: Membuat Tabel Database

Buka phpMyAdmin, buat database bernama latihan, lalu jalankan query berikut untuk membuat tabel users:

CREATE DATABASE IF NOT EXISTS latihan;
USE latihan;

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Perhatikan kolom password dibuat VARCHAR(255). Ini penting karena hasil password_hash() panjangnya bisa 60 karakter atau lebih — jangan dibuat pendek.

Langkah 2: Membuat Akun Pertama (dengan Password Ter-hash)

Kita tidak boleh menyimpan password apa adanya. Buat file buat_user.php untuk membuat satu akun uji coba:

<?php
require "koneksi.php";

$username = "admin";
$password = password_hash("rahasia123", PASSWORD_DEFAULT); // hash password

$stmt = $koneksi->prepare("INSERT INTO users (username, password) VALUES (?, ?)");
$stmt->bind_param("ss", $username, $password);

if ($stmt->execute()) {
    echo "User berhasil dibuat!";
} else {
    echo "Gagal: " . $stmt->error;
}
?>

password_hash() mengubah “rahasia123” menjadi teks acak yang tidak bisa dibalik. Jalankan file ini sekali di browser, lalu hapus filenya. Jangan pernah memakai md5() yang sudah tidak aman.

Langkah 3: File Koneksi Database

Buat koneksi.php. File ini dipakai berulang oleh file lain:

<?php
$host = "localhost";
$user = "root";
$pass = "";        // kosong secara default di XAMPP
$db   = "latihan";

$koneksi = new mysqli($host, $user, $pass, $db);

if ($koneksi->connect_error) {
    die("Koneksi gagal: " . $koneksi->connect_error);
}
?>

Langkah 4: Halaman Login

Buat login.php. File ini menampilkan form sekaligus memproses login saat dikirim:

<?php
session_start();
require "koneksi.php";

$error = "";

if ($_SERVER["REQUEST_METHOD"] === "POST") {
    $username = trim($_POST["username"]);
    $password = $_POST["password"];

    // Ambil user berdasarkan username memakai prepared statement
    $stmt = $koneksi->prepare("SELECT id, username, password FROM users WHERE username = ?");
    $stmt->bind_param("s", $username);
    $stmt->execute();
    $hasil = $stmt->get_result();

    if ($hasil->num_rows === 1) {
        $user = $hasil->fetch_assoc();
        // Cocokkan password yang diketik dengan hash di database
        if (password_verify($password, $user["password"])) {
            session_regenerate_id(true);           // cegah session fixation
            $_SESSION["user_id"]  = $user["id"];
            $_SESSION["username"] = $user["username"];
            header("Location: dashboard.php");
            exit;
        }
    }
    $error = "Username atau password salah.";
}
?>
<!DOCTYPE html>
<html lang="id">
<head><meta charset="UTF-8"><title>Login</title></head>
<body>
    <h2>Halaman Login</h2>
    <?php if ($error): ?>
        <p style="color:red"><?= htmlspecialchars($error) ?></p>
    <?php endif; ?>
    <form method="post">
        <input type="text" name="username" placeholder="Username" required><br><br>
        <input type="password" name="password" placeholder="Password" required><br><br>
        <button type="submit">Masuk</button>
    </form>
</body>
</html>

Penjelasan bagian penting

  • session_start() wajib di baris paling atas agar bisa memakai $_SESSION.
  • Prepared statement (prepare + bind_param) mencegah SQL injection. Jangan pernah menyisipkan $_POST langsung ke query.
  • password_verify() membandingkan password yang diketik dengan hash di database tanpa perlu men-decrypt apa pun.
  • session_regenerate_id(true) mengganti ID sesi setelah login berhasil, menutup celah session fixation.
  • htmlspecialchars() pada output mencegah serangan XSS.

Langkah 5: Halaman Dashboard (Terproteksi)

Buat dashboard.php. Halaman ini menolak pengunjung yang belum login:

<?php
session_start();

// Jika belum login, tendang ke halaman login
if (!isset($_SESSION["user_id"])) {
    header("Location: login.php");
    exit;
}
?>
<!DOCTYPE html>
<html lang="id">
<head><meta charset="UTF-8"><title>Dashboard</title></head>
<body>
    <h2>Selamat datang, <?= htmlspecialchars($_SESSION["username"]) ?>!</h2>
    <p>Ini halaman yang hanya bisa diakses setelah login.</p>
    <a href="logout.php">Logout</a>
</body>
</html>

Langkah 6: Logout

Buat logout.php untuk menghapus sesi:

<?php
session_start();
session_unset();    // hapus semua variabel sesi
session_destroy();  // hancurkan sesi
header("Location: login.php");
exit;
?>

Menguji Aplikasi

Buka http://localhost/login-app/login.php, masuk dengan username admin dan password rahasia123. Jika benar, Anda diarahkan ke dashboard. Coba akses dashboard.php langsung tanpa login — Anda akan dilempar kembali ke halaman login.

Kesalahan Umum

  • “headers already sent” — ada spasi atau output sebelum session_start()/header(). Pastikan <?php benar-benar di baris pertama.
  • Menyimpan password apa adanya atau dengan md5 — sangat berbahaya. Selalu password_hash().
  • Menyisipkan input langsung ke query — membuka SQL injection. Selalu prepared statement.
  • Kolom password terlalu pendek — hash terpotong sehingga password_verify() selalu gagal.

Kesimpulan

Anda telah membuat sistem login PHP dan MySQL yang aman dengan session, password_hash(), dan prepared statement. Pola ini adalah fondasi hampir semua aplikasi web. Langkah berikutnya, tambahkan halaman registrasi agar pengguna bisa mendaftar sendiri, dan pelajari cara mengelola data dengan CRUD.

Referensi: untuk penjelasan fungsi lebih mendalam, kunjungi dokumentasi resmi PHP (php.net).

Baca Juga

Ali Akbar

Software Developer yang fokus mengembangkan aplikasi berbasis Web dan Desktop. Senang mempelajari teknologi baru terutama di bidang web design dan web development.

View all posts by Ali Akbar →

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *