Cara Membuat Form Login dan Register dengan PHP dan MySQL

Agar pengguna bisa punya akun sendiri, aplikasi butuh dua halaman kembar: register (mendaftar) dan login (masuk). Pada tutorial ini kita akan membuat form login dan register dengan PHP dan MySQL yang lengkap dan aman — dengan password_hash(), pengecekan username ganda, dan session. Fokus utama di sini adalah proses registrasi; untuk pendalaman login, Anda bisa merujuk tutorial login kami.

Alur Sistem

Pengguna register → data (dengan password ter-hash) tersimpan ke tabel users → pengguna login → sistem mencocokkan password → jika cocok, session dibuat dan pengguna masuk ke dashboard.

Diagram alur register dan login PHP dengan MySQL
Diagram alur register dan login PHP dengan MySQL

Langkah 1: Tabel Users

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
);

Kolom username diberi UNIQUE agar database menolak username yang sama secara otomatis — lapisan pertahanan tambahan.

Langkah 2: Koneksi

<?php
$koneksi = new mysqli("localhost", "root", "", "latihan");
if ($koneksi->connect_error) {
    die("Koneksi gagal: " . $koneksi->connect_error);
}
?>

Langkah 3: Halaman Register

Buat register.php. File ini memvalidasi input, mengecek username yang sudah dipakai, lalu menyimpan password yang sudah di-hash:

<?php
require "koneksi.php";
$pesan = "";

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

    if ($username === "" || $password === "") {
        $pesan = "Semua field wajib diisi.";
    } elseif (strlen($password) < 6) {
        $pesan = "Password minimal 6 karakter.";
    } elseif ($password !== $konfirmasi) {
        $pesan = "Konfirmasi password tidak cocok.";
    } else {
        // Cek apakah username sudah dipakai
        $cek = $koneksi->prepare("SELECT id FROM users WHERE username = ?");
        $cek->bind_param("s", $username);
        $cek->execute();
        $cek->store_result();

        if ($cek->num_rows > 0) {
            $pesan = "Username sudah digunakan, pilih yang lain.";
        } else {
            // Simpan dengan password ter-hash
            $hash = password_hash($password, PASSWORD_DEFAULT);
            $stmt = $koneksi->prepare("INSERT INTO users (username, password) VALUES (?, ?)");
            $stmt->bind_param("ss", $username, $hash);
            $stmt->execute();
            header("Location: login.php?daftar=sukses");
            exit;
        }
    }
}
?>
<!DOCTYPE html>
<html lang="id">
<head><meta charset="UTF-8"><title>Register</title></head>
<body>
    <h2>Daftar Akun</h2>
    <?php if ($pesan): ?><p style="color:red"><?= htmlspecialchars($pesan) ?></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>
        <input type="password" name="konfirmasi" placeholder="Ulangi Password" required><br><br>
        <button type="submit">Daftar</button>
    </form>
    <p>Sudah punya akun? <a href="login.php">Login di sini</a></p>
</body>
</html>

Penjelasan bagian penting

  • Validasi berlapis: cek kosong, panjang minimal password, dan kecocokan konfirmasi — semua di sisi server.
  • Cek username ganda: query SELECT lebih dulu agar bisa memberi pesan ramah, meski kolom sudah UNIQUE.
  • password_hash() mengubah password menjadi hash yang aman sebelum disimpan.

Langkah 4: Halaman Login

Buat login.php. Prosesnya: ambil user berdasarkan username, lalu verifikasi password dengan password_verify():

<?php
session_start();
require "koneksi.php";
$pesan = "";

if (isset($_GET["daftar"])) {
    $pesan = "Registrasi berhasil, silakan login.";
}

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

    $stmt = $koneksi->prepare("SELECT id, username, password FROM users WHERE username = ?");
    $stmt->bind_param("s", $username);
    $stmt->execute();
    $user = $stmt->get_result()->fetch_assoc();

    if ($user && password_verify($password, $user["password"])) {
        session_regenerate_id(true);
        $_SESSION["user_id"]  = $user["id"];
        $_SESSION["username"] = $user["username"];
        header("Location: dashboard.php");
        exit;
    } else {
        $pesan = "Username atau password salah.";
    }
}
?>
<!DOCTYPE html>
<html lang="id">
<head><meta charset="UTF-8"><title>Login</title></head>
<body>
    <h2>Login</h2>
    <?php if ($pesan): ?><p><?= htmlspecialchars($pesan) ?></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>
    <p>Belum punya akun? <a href="register.php">Daftar</a></p>
</body>
</html>

Langkah 5: Dashboard & Logout

<?php
// dashboard.php
session_start();
if (!isset($_SESSION["user_id"])) {
    header("Location: login.php");
    exit;
}
echo "<h2>Halo, " . htmlspecialchars($_SESSION["username"]) . "</h2>";
echo '<a href="logout.php">Logout</a>';
?>
<?php
// logout.php
session_start();
session_destroy();
header("Location: login.php");
exit;
?>

Kesalahan Umum

  • Password disimpan apa adanya — wajib password_hash(), jangan md5/sha1.
  • Tidak cek username ganda — menimbulkan error atau akun ganda.
  • Validasi hanya di HTML — atribut required mudah dilewati; validasi di PHP wajib.
  • Lupa session_start() di halaman yang memakai session.

Kesimpulan

Anda telah membuat form login dan register PHP dan MySQL yang aman: registrasi dengan validasi berlapis dan password_hash(), serta login berbasis session. Langkah lanjut: tambahkan fitur “lupa password”, verifikasi email, atau batasi percobaan login untuk keamanan ekstra.

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 *