Cara Membuat Users Registration PHP + MySQL dengan Mudah
Halo gengs! Kali ini kita bakal ngebahas sebuah topik yang fundamental banget buat kamu yang lagi belajar web development. Kalau kamu berniat bikin web portal, e-commerce, atau aplikasi berbasis web lainnya, fitur pendaftaran pengguna adalah gerbang pertama yang wajib kamu kuasai. Tanpa adanya sistem autentikasi yang solid, kamu nggak akan bisa mengelola hak akses pengguna dengan aman.
Nah, buat kamu yang pengen beneran paham cara membuat users registration, kamu udah di tempat yang tepat nih! Kita nggak cuma akan bikin form asal jadi yang penting data masuk, tapi kita bakal bikin sistem registrasi yang clean, terstruktur, menggunakan PDO (PHP Data Objects) demi keamanan, serta menerapkan standar enkripsi password modern. Yuk, langsung kita bahas satu per satu secara santai tapi sangat presisi!
Nah gengs, buat kamu yang lebih suka belajar lewat video, aku udah siapin videonya juga nih. Langsung tonton aja ya:
Mengapa Belajar Cara Membuat Users Registration Itu Penting?
Sebelum kita menulis baris kode pertama kita, kita perlu memahami dulu arsitektur dasar dari sebuah sistem autentikasi. Di dunia nyata, membuat form pendaftaran bukan sekadar masalah memindahkan teks dari browser ke dalam database. Ini adalah masalah menjaga integritas data dan melindungi privasi user.
Jika kamu memahami konsep dasar pendaftaran pengguna ini, kamu akan lebih mudah mempelajari konsep-konsep lanjutan seperti:
- Sistem login dan manajemen sesi (session management).
- Pembatasan hak akses halaman (role-based access control).
- Fitur lupa password dengan token verifikasi email.
- Integrasi sistem keamanan OAuth menggunakan akun pihak ketiga seperti Google atau GitHub.
Menurut aku sih, menguasai alur ini adalah investasi keterampilan yang paling efisien kalau kamu mau berkarir sebagai backend developer. Banyak developer pemula yang melewatkan pemahaman mendasar ini dan langsung lompat ke framework, akhirnya mereka kebingungan saat terjadi celah keamanan di aplikasi mereka. Jadi, mari kita pelajari dengan cara yang benar sejak awal!
Langkah-Langkah Membuat Users Registration
Nah sekarang sahabat Ops Irvan, mari kita langsung bahas tentang bagaimana sih kalian bisa membuat fitur Users Registration alias halaman daftar untuk para pengunjung website dan aplikasi kalian. Sebenarnya tidak terlalu repot kok jika kalian ingin membuat fitur pendaftaran pada website atau aplikasi kalian.
Pada bahasa PHP contohnya yang akan admin jadikan pembahasan tutorialnya pada artikel kali ini gengs. Jadi silahkan simak terus langkah-langkah yang ada di tutorial kali ini yah gengs.
Langkah 1: Persiapan Database untuk Cara Membuat Users Registration
Nah gengs selanjutnya itu DB, sekarang kita masuk ke bagian yang mungkin paling penting nih, yaitu mendesain wadah penyimpanan data kita. Kita akan menggunakan MySQL sebagai sistem manajemen database (RDBMS). Langkah pertama adalah membuat database baru dan tabel yang akan menampung data akun dari user yang mendaftar.
Silakan buka tool administrasi database kamu, seperti phpMyAdmin, Laragon, atau DBeaver. Jalankan query SQL di bawah ini untuk membuat database dan tabel users:
CREATE DATABASE IF NOT EXISTS `user_registration_db` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE `user_registration_db`; CREATE TABLE IF NOT EXISTS `users` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `username` VARCHAR(50) NOT NULL UNIQUE, `email` VARCHAR(100) NOT NULL UNIQUE, `password` VARCHAR(255) NOT NULL, `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB;
Mari kita bedah secara teknis struktur tabel di atas agar kamu tahu alasan di balik pemilihan tipe datanya:
- id: Menggunakan tipe data INT dengan atribut AUTO_INCREMENT dan ditunjuk sebagai PRIMARY KEY. Ini memastikan setiap user memiliki nomor identifikasi unik yang bertambah otomatis.
- username & email: Memiliki batasan UNIQUE. Artinya, sistem database akan menolak secara otomatis jika ada dua user berbeda yang mencoba mendaftar dengan username atau email yang sama. Ini adalah lapisan pengamanan pertama di level database.
- password: Kita menggunakan panjang VARCHAR(255). Mengapa panjang sekali padahal input user mungkin hanya 8 karakter? Jawabannya karena kita akan melakukan hashing satu arah pada password menggunakan algoritma Bcrypt yang menghasilkan string panjang acak sepanjang 60 hingga 255 karakter.
- created_at: Menggunakan tipe TIMESTAMP dengan nilai bawaan CURRENT_TIMESTAMP untuk mencatat waktu pendaftaran user secara presisi tanpa perlu bantuan skrip PHP tambahan.

Langkah 2: Membuat Koneksi Database Aman Menggunakan PDO
Oke, lanjut ke poin berikutnya yuk! Setelah database siap, sekarang kita harus menghubungkan aplikasi PHP kita ke MySQL. Di masa lalu, programmer PHP banyak menggunakan fungsi mysql_connect() atau mysqli. Namun, demi standar industri modern, kita akan menggunakan PDO (PHP Data Objects).
PDO memiliki kelebihan utama berupa portabilitas database (bisa ganti ke PostgreSQL atau SQLite tanpa mengubah banyak kode) serta dukungan penuh terhadap *prepared statements* yang secara otomatis mengamankan aplikasi dari bahaya SQL Injection.
Buatlah berkas bernama connection.php di dalam folder proyekmu, lalu masukkan kode berikut:
<?php // Menentukan parameter koneksi database $host = 'localhost'; $db_name = 'user_registration_db'; $username = 'root'; $password = ''; // Sesuaikan dengan password database local kamu (kosongkan jika default XAMPP) $charset = 'utf8mb4'; // Menyiapkan DSN (Data Source Name) $dsn = "mysql:host=$host;dbname=$db_name;charset=$charset"; // Konfigurasi opsi PDO untuk penanganan error dan keamanan data $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, ]; try { // Membuat instance PDO baru $pdo = new PDO($dsn, $username, $password, $options); } catch (PDOException $e) { // Jika koneksi gagal, hentikan eksekusi dan tampilkan pesan kesalahan terkontrol error_log($e->getMessage()); die("Sistem mengalami masalah teknis. Silakan coba beberapa saat lagi."); } ?>
Waktu pertama kali aku nyoba ini, jujur agak bingung kenapa konfigurasinya harus sepanjang ini. Tapi setelah dipelajari, opsi-opsi di atas sangat krusial. Misalnya, opsi PDO::ATTR_EMULATE_PREPARES => false memaksa PHP untuk menggunakan prepared statement asli bawaan MySQL, yang membuat query pencarian dan manipulasi data jauh lebih aman dari manipulasi karakter berbahaya.
Langkah 3: Mendesain Form HTML untuk Cara Membuat Users Registration
Nah setelah tahu cara menghubungkan program ke database, sekarang waktunya kita membuat jembatan interaksi bagi pengguna, yaitu sebuah halaman HTML berisi form pendaftaran. Form ini akan bertugas menangkap input berupa username, alamat email, password, serta konfirmasi ulang password untuk mencegah kesalahan ketik.
Buatlah berkas bernama register.php. Kita akan meletakkan elemen HTML dan kode pemrosesan PHP-nya di berkas yang sama agar lebih mudah dikelola. Tulis kode HTML dasar di bawah ini terlebih dahulu:
<!DOCTYPE html> <html lang="id"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Form Pendaftaran Pengguna</title> <style> body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background-color: #f4f7f6; margin: 0; display: flex; justify-content: center; align-content: center; align-items: center; height: 100vh; } .register-container { background: #ffffff; padding: 30px; border-radius: 10px; box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); width: 100%; max-width: 400px; } .register-container h2 { margin-bottom: 20px; font-size: 24px; color: #333333; text-align: center; } .form-group { margin-bottom: 15px; } .form-group label { display: block; margin-bottom: 5px; color: #666; font-weight: 600; } .form-group input { width: 100%; padding: 10px; border: 1px solid #ccc; border-radius: 5px; box-sizing: border-box; font-size: 14px; } .form-group input:focus { border-color: #4caf50; outline: none; } .btn-register { width: 100%; padding: 12px; background-color: #4caf50; border: none; color: white; font-size: 16px; font-weight: bold; border-radius: 5px; cursor: pointer; transition: background-color 0.3s; } .btn-register:hover { background-color: #45a049; } .alert { padding: 10px; border-radius: 5px; margin-bottom: 15px; font-size: 14px; } .alert-error { background-color: #f8d7da; color: #721c24; border: 1px solid #f5c6cb; } .alert-success { background-color: #d4edda; color: #155724; border: 1px solid #c3e6cb; } </style> </head> <form method="post"><input type="text" name="nama"/></form><body>
Rancangan Form Daftar Akun Baru
Kurang lebih susunan yang akan admin buat itu form-nya seperti berikut ini:
<!-- Nanti kita akan meletakkan pesan error/sukses di sini -->
Username
Alamat Email
Password
Konfirmasi Password
Daftar Sekarang
</body> </html>
Perhatikan beberapa atribut penting pada form HTML di atas:
- action="register.php": Form ini akan mengirimkan datanya kembali ke dirinya sendiri, sehingga pemrosesan backend dan rendering UI berada di satu tempat yang dinamis.
- method="POST": Sangat penting! Pengiriman kredensial sensitif seperti password wajib menggunakan metode POST agar data tidak terekspos di URL browser.
- novalidate: Atribut ini digunakan untuk mematikan validasi bawaan browser agar kita bisa menguji sepenuhnya keandalan validasi sisi server (backend) yang telah kita rancang sendiri di PHP.
Langkah 4: Menulis Skrip Logika Backend PHP
Kalau kamu udah paham pembuatan interface form-nya, bagian ini bakal lebih mudah dipahami nih. Sekarang kita akan menulis otak dari sistem registrasi ini. Skrip PHP ini akan menangkap data yang dikirim melalui metode POST, melakukan serangkaian validasi ketat, mengamankan password, lalu menyimpannya ke database menggunakan prepared statements.
Silakan letakkan baris kode PHP berikut tepat di bagian paling atas berkas register.php, bahkan sebelum tag <!DOCTYPE html> dimulai:
<?php // Hubungkan dengan file koneksi database require_once 'connection.php'; // Inisialisasi variabel untuk menampung pesan error atau sukses $errors = []; $success_message = ''; // Memeriksa apakah form telah dikirimkan menggunakan tombol register if (isset($_POST['register'])) { // Melakukan sanitasi input dasar untuk mencegah serangan Cross-Site Scripting (XSS) $username = trim(htmlspecialchars($_POST['username'])); $email = trim(htmlspecialchars($_POST['email'])); $password = $_POST['password']; $password_confirm = $_POST['password_confirm']; // --- VALIDASI DATA INPUT --- // 1. Memeriksa kolom kosong if (empty($username) || empty($email) || empty($password) || empty($password_confirm)) { $errors[] = "Semua kolom wajib diisi."; } // 2. Memeriksa validitas format email if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { $errors[] = "Format alamat email tidak valid."; } // 3. Memeriksa kecocokan password dan konfirmasi password if ($password !== $password_confirm) { $errors[] = "Konfirmasi password tidak cocok dengan password awal."; } // 4. Memeriksa panjang karakter minimum password if (strlen($password) < 8) { $errors[] = "Panjang password minimal harus terdiri dari 8 karakter."; } // --- MEMERIKSA KETERSEDIAAN USERNAME DAN EMAIL DI DATABASE --- if (empty($errors)) { try { // Menyiapkan query pencarian username atau email yang sudah ada $stmt = $pdo->prepare("SELECT id FROM users WHERE username = :username OR email = :email"); $stmt->execute([ 'username' => $username, 'email' => $email ]); $existing_user = $stmt->fetch(); if ($existing_user) { $errors[] = "Username atau email sudah digunakan oleh akun lain."; } } catch (PDOException $e) { error_log($e->getMessage()); $errors[] = "Terjadi kesalahan sistem internal. Silakan coba lagi."; } } // --- JIKA TIDAK ADA ERROR, PROSES REGISTRASI KE DATABASE --- if (empty($errors)) { try { // Melakukan hashing password menggunakan algoritma BCRYPT yang sangat aman $hashed_password = password_hash($password, PASSWORD_BCRYPT); // Menyiapkan query untuk melakukan penyimpanan data (INSERT) $insert_stmt = $pdo->prepare("INSERT INTO users (username, email, password) VALUES (:username, :email, :password)"); // Mengeksekusi query dengan menyematkan variabel aman $result = $insert_stmt->execute([ 'username' => $username, 'email' => $email, 'password' => $hashed_password ]); if ($result) { $success_message = "Registrasi berhasil! Akun kamu telah aktif, silakan melakukan login."; // Mengosongkan variabel input agar form bersih kembali $username = $email = ''; } else { $errors[] = "Pendaftaran gagal. Terjadi kesalahan pada saat memproses data."; } } catch (PDOException $e) { error_log($e->getMessage()); $errors[] = "Gagal mendaftarkan pengguna: " . $e->getMessage(); } } } ?>
Aku mengerti banget perasaan bingung di tahap ini — hampir semua orang mengalaminya saat pertama kali mengintegrasikan logika PHP dengan database. Namun perhatikan alurnya yang sangat berurutan dan logis: kita menolak input kosong, memverifikasi format data, memeriksa apakah user tersebut sudah pernah terdaftar, mengacak password-nya dengan metode satu arah yang kuat, lalu memasukkannya dengan aman ke database menggunakan query yang parameternya sudah dipetakan.

Langkah 5: Mengintegrasikan Pesan Error dan Sukses ke dalam UI Form
Oke gengs, ini dia bagian yang paling aku tunggu-tunggu, yaitu menyatukan logika backend dengan tampilan HTML kita. Jika saat ini kamu mencoba menjalankan kode di atas, proses registrasi akan berjalan di latar belakang tetapi pengguna tidak akan pernah tahu apakah registrasi mereka berhasil atau gagal karena kita belum menampilkan pesannya di layar.
Untuk itu, ubahlah penanda komentar <!-- Nanti kita akan meletakkan pesan error/sukses di sini --> yang ada di dalam form HTML register.php milikmu dengan kode PHP dinamis berikut ini:
<?php if (!empty($errors)): ?>
<?php echo htmlspecialchars($error); ?>
<?php endif; ?> <?php if (!empty($success_message)): ?>
<?php echo htmlspecialchars($success_message); ?>
<?php endif; ?>
Dengan tambahan potongan kode di atas, setiap kali variabel array $errors berisi pesan validasi, PHP akan mengulangi (looping) isinya dan menampilkannya dalam kotak merah bergaya responsif. Sebaliknya, ketika proses penyimpanan sukses, pesan hijau cerah akan memberi tahu user bahwa mereka sudah siap untuk menggunakan akun barunya.
Langkah 6: Memahami Pentingnya Enkripsi dengan Password Hashing
Sebelum kita menguji aplikasi yang baru kita buat, mari kita luangkan waktu sejenak untuk membahas hal krusial yang menyangkut keamanan privasi user. Di dalam skrip registrasi kita, perhatikan baris kode ini:
$hashed_password = password_hash($password, PASSWORD_BCRYPT);
Mengapa kita dilarang keras menyimpan password langsung dalam bentuk teks asli (plain text) ke database? Bayangkan jika database kamu bocor ke tangan pihak luar akibat celah keamanan di server atau kelalaian konfigurasi lainnya. Jika password disimpan dalam bentuk teks asli, semua akun user kamu terancam dibajak seketika.
Dengan menerapkan fungsi password_hash() dengan algoritma Bcrypt yang direkomendasikan dalam dokumentasi resmi PHP Password Hashing, string sandi asli diubah menjadi string enkripsi rumit yang mustahil untuk didekripsi balik secara langsung. Algoritma ini secara otomatis menambahkan salt unik di tingkat internal yang melindunginya dari serangan pencarian kamus kata sandi (rainbow table).

Langkah 7: Melakukan Pengujian (Testing) Sistem Registrasi
Nah gengs, sekarang waktunya kita lakukan pembuktian secara nyata apakah sistem pendaftaran kita sudah berfungsi dengan lancar tanpa ada error atau bug mengganggu. Ikuti langkah-langkah di bawah ini untuk menguji form baru kamu:
- Aktifkan server lokal kamu (misalnya Apache dan MySQL di dashboard XAMPP atau Laragon).
- Buka browser pilihanmu, lalu akses file proyekmu melalui alamat local, contohnya: http://localhost/belajar-php/register.php.
- Cobalah mengirim form dalam keadaan kosong terlebih dahulu. Sistem harus mencegah pengiriman dan memunculkan notifikasi merah berbunyi: "Semua kolom wajib diisi."
- Masukkan email dengan format salah (misalnya namauser@tanpadomain). Kamu harus melihat notifikasi format email tidak valid.
- Cobalah mendaftar dengan password yang kurang dari 8 karakter atau konfirmasi sandi yang sengaja dibuat tidak cocok.
- Terakhir, cobalah mendaftar dengan data yang valid sepenuhnya. Kamu akan melihat notifikasi registrasi berhasil berwarna hijau.
- Periksa tabel users di database kamu melaui phpMyAdmin. Pastikan datanya masuk dengan sempurna dan kolom password kamu berisi kode acak panjang terenkripsi secara aman!
Coba deh langsung praktekin langkah-langkah di atas setelah membaca ini! Pengujian secara langsung adalah cara paling ampuh agar kamu bisa mengingat polanya dan melatih logika analisismu saat memperbaiki jika ada pesan error tak terduga.
Pertanyaan Seputar cara membuat users registration
Apakah cara membuat users registration dengan PHP native ini aman?
Skrip yang kita bangun di tutorial ini sudah jauh lebih aman dibanding skrip dasar yang biasa kamu temukan di blog-blog jadul karena sudah menggunakan PDO prepared statements untuk memblokir SQL Injection, serta fungsi enkripsi password_hash modern untuk melindungi sandi user. Namun, jika ingin dibawa ke skala produksi, kamu sebaiknya menambahkan token CSRF (Cross-Site Request Forgery) pada form dan memproses validasi yang jauh lebih kompleks di sisi server.
Bagaimana cara membuat users registration yang mendukung verifikasi email?
Untuk menerapkan sistem aktivasi email, kamu perlu menambahkan satu kolom bernama verification_token (tipe VARCHAR) dan is_active (tipe TINYINT default 0) di tabel users kamu. Setelah query pendaftaran berhasil, kirimkan email berisi tautan unik berisi token tersebut kepada pengguna menggunakan pustaka mailer seperti PHPMailer. Ketika tautan tersebut diklik, ubah status is_active menjadi 1.
Kenapa kita menggunakan PDO dibanding MySQLi untuk proyek pendaftaran user?
Meskipun MySQLi juga mendukung prepared statements, PDO jauh lebih fleksibel karena mendukung banyak driver database yang berbeda. Selain itu, penulisan nama parameter query (named parameters) di PDO terasa jauh lebih rapi dibanding MySQLi yang hanya menggunakan tanda tanya penanda tempat (positional parameters) sehingga membuat baris kode kita jauh lebih mudah dibaca dan dipelihara dalam jangka panjang.
Mengapa database saya mengembalikan error 'Duplicate entry' ketika mendaftar?
Hal itu terjadi karena pada bagian skema pembuatan tabel MySQL di langkah pertama, kita menetapkan batasan unik (UNIQUE constraint) pada kolom username dan email. Database secara tegas menolak ada data duplikat yang sama persis agar integritas sistem tetap terjaga. Di bagian logika PHP kita, kita sudah mengantisipasinya dengan memeriksa data tersebut terlebih dahulu ke database sebelum melakukan aksi insert.
Kesimpulan
Membuat fitur pendaftaran akun pengguna adalah keahlian wajib yang mutlak dimiliki oleh pengembang aplikasi web modern. Di artikel ini, kita telah belajar bagaimana merancang database MySQL yang andal, menyusun arsitektur koneksi database yang aman menggunakan pustaka PDO, merancang form input yang dinamis, hingga mengolah datanya secara aman dengan kombinasi validasi data dan sistem enkripsi kata sandi termutakhir.
Menurut opini pribadi aku sih, selalu prioritaskan faktor keamanan sejak awal kamu mendesain sistem, jangan pernah menundanya di akhir proyek. Semoga artikel ini bermanfaat ya gengs! Kalau kamu menemui kendala atau ada kode yang error saat dipraktikkan, drop aja keluhan dan pertanyaanmu langsung di kolom komentar di bawah ya. Sampai jumpa di tutorial seru lainnya!
MUH IRVAN JAYA, S.KOM
Full-Stack Laravel Developer & Operator Sekolah dari Bantaeng, Sulawesi Selatan. Membuat tools web gratis & berbagi tutorial coding.