PHP

How to Create a PHP Registration Form with Gmail SMTP Email Confirmation

Ravindra Kumar

Building a secure and user-friendly registration system is one of the most common requirements in web development. In this tutorial, we’ll create a registration form in PHP that:

  • Accepts username, email, and password
  • Validates for unique username and email
  • Stores passwords in a secure hashed format
  • Sends a confirmation email using Gmail SMTP with PHPMailer
  • Uses AJAX for smooth form submission without reloading the page

By the end, you’ll have a working system that can be integrated into any website.

Step 1: Database Setup

Create a table in MySQL to store users:


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

Step 2: Database Connection File

It’s best practice to keep database settings in a separate file (db_config.php):


<?php
$host = "localhost";
$user = "root";
$pass = "";
$db = "test_db";

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

if ($conn->connect_error) {
die("Database Connection failed: " . $conn->connect_error);
}
?>

Step 3: HTML Registration Form

Here’s a simple Bootstrap-styled form:


<form id="formAuthentication" method="POST">
<div class="mb-3">
<label for="username" class="form-label">Username</label>
<input type="text" class="form-control" id="username" name="username" required>
</div>
<div class="mb-3">
<label for="email" class="form-label">Email</label>
<input type="email" class="form-control" id="email" name="email" required>
</div>
<div class="mb-3">
<label for="password" class="form-label">Password</label>
<input type="password" class="form-control" id="password" name="password" required>
</div>
<button type="submit" class="btn btn-primary">Sign Up</button>
</form>

<div id="resultMessage" class="mt-3"></div>

Download PHP Registration form

Step 4: Registration Logic with PHPMailer (Gmail SMTP)

In registration.php, we handle validation, database insertion, and sending emails:

Gmail SMTP detail file (db_config.php)

<?php
 // SMTP settings
$mail->isSMTP();
$mail->Host       = 'smtp.gmail.com';
$mail->SMTPAuth   = true;
$mail->Username   = '';   // your Gmail
$mail->Password   = '';     // Gmail App Password
$mail->SMTPSecure = 'tls';                   // or PHPMailer::ENCRYPTION_STARTTLS
$mail->Port       = 587;

?>

<?php
header("Content-Type: application/json");
include 'db_config.php';

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php'; // If installed via Composer

$response = ["status" => "error", "message" => "Something went wrong!"];

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

// Validate inputs
if (empty($username) || empty($email) || empty($password)) {
$response["message"] = "All fields are required!";
echo json_encode($response);
exit;
}

// Check for duplicate username/email
$checkUser = $conn->prepare("SELECT id FROM users WHERE username=? OR email=?");
$checkUser->bind_param("ss", $username, $email);
$checkUser->execute();
$checkUser->store_result();

if ($checkUser->num_rows > 0) {
$response["message"] = "Username or Email already exists!";
echo json_encode($response);
exit;
}

// Hash password
$hashedPassword = password_hash($password, PASSWORD_BCRYPT);

// Insert into database
$stmt = $conn->prepare("INSERT INTO users (username, email, password) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $username, $email, $hashedPassword);

if ($stmt->execute()) {
// Send confirmation email
$mail = new PHPMailer(true);
try {
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com';
$mail->SMTPAuth = true;
$mail->Username = 'yourgmail@gmail.com';
$mail->Password = 'your-app-password';
$mail->SMTPSecure = 'tls';
$mail->Port = 587;

$mail->setFrom('yourgmail@gmail.com', 'Your Website');
$mail->addAddress($email, $username);
$mail->Subject = "Registration Successful!";
$mail->Body = "Hello $username,\n\nYour registration was successful.\n\nRegards,\nYour Website Team";

$mail->send();
$response = ["status" => "success", "message" => "Registration successful! Please check your email."];
} catch (Exception $e) {
$response["message"] = "Registered, but email could not be sent. Error: {$mail->ErrorInfo}";
}
} else {
$response["message"] = "Database error: " . $stmt->error;
}

$stmt->close();
}

$conn->close();
echo json_encode($response);

Step 5: AJAX Form Submission

Instead of refreshing the page, we’ll send data via AJAX:


<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
$(document).on("submit", "#formAuthentication", function(e){
e.preventDefault();
$.ajax({
url: "registration.php",
type: "POST",
data: $(this).serialize(),
dataType: "json",
success: function(response){
let msgBox = $("#resultMessage");
if(response.status === "success"){
msgBox.html('<div class="alert alert-success">'+response.message+'</div>');
$("#formAuthentication")[0].reset();
} else {
msgBox.html('<div class="alert alert-danger">'+response.message+'</div>');
}
},
error: function(xhr){
$("#resultMessage").html('<div class="alert alert-danger">Server Error: '+xhr.responseText+'</div>');
}
});
});
</script>

Step 6: Gmail Setup for SMTP

  • Since Google no longer allows less-secure apps, you must use an App Password:
  • Enable 2-Step Verification in your Google account.
  • Go to Security → App Passwords.
  • Generate a new password (select “Mail” and “Other”).
  • Use this App Password in $mail->Password.

Conclusion

You’ve now built a secure PHP registration system with:
✅ User input validation
✅ Unique username & email enforcement
✅ Password hashing for security
✅ Gmail SMTP email confirmation via PHPMailer
✅ Smooth AJAX submission

This setup ensures a professional and secure user registration flow for your web applications.

Download PHP Registration form

Ravindra Kumar

Ravindra is a passionate full stack developer and dedicated blogger with a flair for crafting user-friendly web applications and insightful articles. With expertise spanning front-end and back-end technologies, Ravindra brings ideas to life through innovative coding solutions.

Suggested Reading

How to Create a Simple Login System in PHP

A login system is one of the most essential features of any website or web application. Whether it’s an e-commerce site, a blogging platform, or an internal company portal, user authentication ensures that only authorized users can access specific areas. In this article, we’ll walk through creating a simple login system in PHP using MySQL. […]

Clear Cache After Logout in PHP | Prevent going to back after logout in PHP

One of the most common issues developers face when building a login system in PHP is users being able to press the back button after logging out and still seeing the dashboard or other protected pages. This happens because browsers often cache pages, so even without an active session, the back button shows the previously […]

PHP Login Dashboard Template with Bootstrap Free Download

A secure and stylish login dashboard is one of the most essential components of any web application. Whether you’re building an admin panel, school management system, e-commerce backend, or a personal project, having a professional login system with a responsive dashboard can save you both time and effort. In this article, we’ll discuss how you […]

How to send emails by Gmail SMTP Emails in PHP

I’ll show you how to make this Bootstrap form send emails using SMTP. We’ll do this in PHP with PHPMailer, because: It’s reliable Supports SMTP authentication Works with Gmail, Outlook, and custom mail servers Install PHPMailer You can either: Via Composer (recommended) composer require phpmailer/phpmailer Or download from: PHPMailer GitHub and include it manually. HTML […]

How to Create Your Own CAPTCHA (Number Addition) with Form in PHP

CAPTCHA (Completely Automated Public Turing test to tell Computers and Humans Apart) is a simple security mechanism used to prevent automated bots from submitting forms on your website. While there are third-party CAPTCHA services like Google reCAPTCHA, creating a basic number-based CAPTCHA using PHP can be an effective and lightweight solution for small projects. In […]

How to increase phpmyadmin import file size in xampp localhost

To increase the PHPMyAdmin import file size in XAMPP on your localhost, follow these steps: Step 1: Modify php.ini Open XAMPP Control Panel. Click Config next to Apache and select PHP (php.ini). Find and update the following values: upload_max_filesize = 100M post_max_size = 100M memory_limit = 256M max_execution_time = 300 max_input_time = 300 (You can […]