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.

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
SELECTlebih dulu agar bisa memberi pesan ramah, meski kolom sudahUNIQUE. 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
requiredmudah 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).

