Sometimes user forgot their password and wants to to reset in this tutorial will help you to make a reset password in PHP using PHPMailer library this is a mail library using send SMTP mails so first we will check user exist or not then send email if exist will send mail to reset password.
Database structure
-- phpMyAdmin SQL Dump
-- version 5.0.4
-- https://www.phpmyadmin.net/
--
-- Host: 127.0.0.1
-- Generation Time: Dec 29, 2020 at 07:23 AM
-- Server version: 10.4.17-MariaDB
-- PHP Version: 7.3.25
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
START TRANSACTION;
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
--
-- Database: `tutorial`
--
-- --------------------------------------------------------
--
-- Table structure for table `password_reset_temp`
--
CREATE TABLE `password_reset_temp` (
`email` varchar(250) NOT NULL,
`key` varchar(250) NOT NULL,
`expDate` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Dumping data for table `password_reset_temp`
--
INSERT INTO `password_reset_temp` (`email`, `key`, `expDate`) VALUES
('gajanand.kgn@rediffmail.com', 'f53997f1a58352e1fe65046d6953672562bc648b72', '2020-12-30 11:05:26');
-- --------------------------------------------------------
--
-- Table structure for table `signup`
--
CREATE TABLE `signup` (
`id` int(11) NOT NULL,
`username` varchar(100) NOT NULL,
`email` varchar(120) NOT NULL,
`password` varchar(400) NOT NULL,
`ip` varchar(200) NOT NULL,
`member_since` varchar(100) NOT NULL,
`membership` int(11) NOT NULL,
`dom` varchar(100) NOT NULL,
`city` varchar(100) NOT NULL,
`courtry` varchar(100) NOT NULL,
`activate` tinyint(4) NOT NULL,
`first_name` varchar(200) NOT NULL,
`last_name` varchar(200) NOT NULL,
`about_me` varchar(1000) NOT NULL,
`re_emai` varchar(150) NOT NULL,
`gender` varchar(10) NOT NULL,
`mobile` varchar(50) NOT NULL,
`ccode` int(11) NOT NULL,
`activation_has` varchar(300) NOT NULL,
`activation_time` varchar(200) NOT NULL,
`website` varchar(300) NOT NULL,
`fb` varchar(1000) NOT NULL,
`twitter` varchar(1000) NOT NULL,
`fb_id` varchar(300) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Dumping data for table `signup`
--
INSERT INTO `signup` (`id`, `username`, `email`, `password`, `ip`, `member_since`, `membership`, `dom`, `city`, `courtry`, `activate`, `first_name`, `last_name`, `about_me`, `re_emai`, `gender`, `mobile`, `ccode`, `activation_has`, `activation_time`, `website`, `fb`, `twitter`, `fb_id`) VALUES
(30, 'stint', 'gajanand.kgn@rediffmail.com', '$2y$10$9ND.xDaDLZnMup6I4qHfzOpj05zH6AsW4RzHODiWkzmQQllo2UyQC', '113.193.102.61', '2017/09/03 14:50:35', 1, '', 'Indore', 'India', 1, 'Gajanand', 'Rathor', '', '', 'M', '', 0, 'null', '', '', '', '', '');
--
-- Indexes for dumped tables
--
--
-- Indexes for table `signup`
--
ALTER TABLE `signup`
ADD PRIMARY KEY (`id`);
ALTER TABLE `signup` ADD FULLTEXT KEY `ft_signup` (`username`);
--
-- AUTO_INCREMENT for dumped tables
--
--
-- AUTO_INCREMENT for table `signup`
--
ALTER TABLE `signup`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=45;
COMMIT;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
PHPMailer Installation
Install PHPMailer via composer
composer require phpmailer/phpmailer
Above the composer command will automatically download vendor folder and autoload.PHP
#db.php
<?php
$con = mysqli_connect("localhost", "root", "", "tutorial");
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
die();
}
date_default_timezone_set('Asia/Kolkata');
$error = "";
?>
#index.php
<?php
use PHPMailer\PHPMailer\PHPMailer;
?>
<html>
<head>
<title>Password Recovery using PHP and MySQL</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
</head>
<body>
<div class="container-fluid">
<div class="row">
<div class="col-md-4"></div>
<div class="col-md-4">
<h2>Forgot Password</h2>
<?php
include('db.php');
if (isset($_POST["email"]) && (!empty($_POST["email"]))) {
$email = $_POST["email"];
$email = filter_var($email, FILTER_SANITIZE_EMAIL);
$email = filter_var($email, FILTER_VALIDATE_EMAIL);
if (!$email) {
$error .="Invalid email address";
} else {
$sel_query = "SELECT * FROM `signup` WHERE email='" . $email . "'";
$results = mysqli_query($con, $sel_query);
$row = mysqli_num_rows($results);
if ($row == "") {
$error .= "User Not Found";
}
}
if ($error != "") {
echo $error;
} else {
$output = '';
$expFormat = mktime(date("H"), date("i"), date("s"), date("m"), date("d") + 1, date("Y"));
$expDate = date("Y-m-d H:i:s", $expFormat);
$key = md5(time());
$addKey = substr(md5(uniqid(rand(), 1)), 3, 10);
$key = $key . $addKey;
// Insert Temp Table
mysqli_query($con, "INSERT INTO `password_reset_temp` (`email`, `key`, `expDate`) VALUES ('" . $email . "', '" . $key . "', '" . $expDate . "');");
$output.='<p>Please click on the following link to reset your password.</p>';
//replace the site url
$output.='<p><a href="http://localhost/tutorial/reset-password.php?key=' . $key . '&email=' . $email . '&action=reset" target="_blank">http://localhost/tutorial/reset-password.php?key=' . $key . '&email=' . $email . '&action=reset</a></p>';
$body = $output;
$subject = "Password Recovery";
$email_to = $email;
//autoload the PHPMailer
require("vendor/autoload.php");
$mail = new PHPMailer();
$mail->IsSMTP();
$mail->Host = "mail.rathorji.in"; // Enter your host here
$mail->SMTPAuth = true;
$mail->Username = "support@rathorji.in"; // Enter your email here
$mail->Password = ""; //Enter your passwrod here
$mail->Port = 587;
$mail->IsHTML(true);
$mail->From = "support@rathorji.in";
$mail->FromName = "Rathorji PHP Tutorial";
$mail->Subject = $subject;
$mail->Body = $body;
$mail->AddAddress($email_to);
if (!$mail->Send()) {
echo "Mailer Error: " . $mail->ErrorInfo;
} else {
echo "An email has been sent";
}
}
}
?>
<form method="post" action="" name="reset">
<div class="form-group">
<label><strong>Enter Your Email Address:</strong></label>
<input type="email" name="email" placeholder="username@email.com" class="form-control"/>
</div>
<div class="form-group">
<input type="submit" id="reset" value="Reset Password" class="btn btn-primary"/>
</div>
</form>
</div>
<div class="col-md-4"></div>
</div>
</div>
</body>
</html>
#reset-password.php
<html>
<head>
<title>Reset Password</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
</head>
<body>
<div class="container-fluid">
<div class="row">
<div class="col-md-4"></div>
<div class="col-md-4">
<?php
include('db.php');
if (isset($_GET["key"]) && isset($_GET["email"]) && isset($_GET["action"]) && ($_GET["action"] == "reset") && !isset($_POST["action"])) {
$key = $_GET["key"];
$email = $_GET["email"];
$curDate = date("Y-m-d H:i:s");
$query = mysqli_query($con, "SELECT * FROM `password_reset_temp` WHERE `key`='" . $key . "' and `email`='" . $email . "';");
$row = mysqli_num_rows($query);
if ($row == "") {
$error .= '<h2>Invalid Link</h2>';
} else {
$row = mysqli_fetch_assoc($query);
$expDate = $row['expDate'];
if ($expDate >= $curDate) {
?>
<h2>Reset Password</h2>
<form method="post" action="" name="update">
<input type="hidden" name="action" value="update" class="form-control"/>
<div class="form-group">
<label><strong>Enter New Password:</strong></label>
<input type="password" name="pass1" value="update" class="form-control"/>
</div>
<div class="form-group">
<label><strong>Re-Enter New Password:</strong></label>
<input type="password" name="pass2" value="update" class="form-control"/>
</div>
<input type="hidden" name="email" value="<?php echo $email; ?>"/>
<div class="form-group">
<input type="submit" id="reset" value="Reset Password" class="btn btn-primary"/>
</div>
</form>
<?php
} else {
$error .= "<h2>Link Expired</h2>>";
}
}
if ($error != "") {
echo "<div class='error'>" . $error . "</div><br />";
}
}
if (isset($_POST["email"]) && isset($_POST["action"]) && ($_POST["action"] == "update")) {
$error = "";
$pass1 = mysqli_real_escape_string($con, $_POST["pass1"]);
$pass2 = mysqli_real_escape_string($con, $_POST["pass2"]);
$email = $_POST["email"];
$curDate = date("Y-m-d H:i:s");
if ($pass1 != $pass2) {
$error .= "<p>Password do not match, both password should be same.<br /><br /></p>";
}
if ($error != "") {
echo $error;
} else {
$pass1 = md5($pass1);
mysqli_query($con, "UPDATE `users` SET `password` = '" . $pass1 . "', `trn_date` = '" . $curDate . "' WHERE `email` = '" . $email . "'");
mysqli_query($con, "DELETE FROM `password_reset_temp` WHERE `email` = '$email'");
echo '<div class="error"><p>Congratulations! Your password has been updated successfully.</p>';
}
}
?>
</div>
<div class="col-md-4"></div>
</div>
</div>
</body>
</html>
Run the following code and see output, I hope you have understood everything