Tutorial PHP : Mengirim Link Reset Lupa Password ke Email

Ada berbagai macam teknik yang bisa digunakan didalam sebuah sistem web php untuk menangani lupa password. Dalam contoh kasus ini Saya akan membuat teknik yang paling umum yaitu dengan cara mengirim sebuah link reset password ke email, dimana rinciannya akan saya buat seperti berikut ini :

  1. User akan melakukan permintaan lupa/reset password dengan memasukan email
  2. Kemudia jika email ditemukan, maka sistem akan mengirim link reset ke email yang bersangkutan
  3. Ketika link email diklik, maka sistem akan mengecek apakah link tersebut benar atau tidak.
  4. Jika link benar maka sistem akan secara otomatis membuat sebuah password baru secara acak, kemudian password tersebut akan dikirim kembali ke email pengguna
  5. Jadi aka nada dua kali pengiriman email, pertama : mengirim link reset, kedua : mengirim password baru yang telah dibuat ke email
  6. Kode akan ditulis menggunakan prosedur OOP atau supaya lebih jelas Anda bisa melihat alur permintaan lupa password dari gambar dibawah ini :
Tutorial PHP : Mengirim Link Reset Lupa Password ke Email


Baca juga : Tutorial PHP : Mengirim Link Aktivasi Akun ke Email

Karena disini kita akan melakukan proses pengiriman email, maka disini Anda memerlukan sebuah fungsi untuk mengirim email, Anda bisa menggunakan fungsi mail() atau menggunakan phpmailer. Tetap disini saya akan mencontohkannya menggunakan fungsi mail().

  1. Buatlah sebuah database baru. Atau silahkan eksekusi query berikut:
    
    --
    -- Struktur dari tabel `lupa_password`
    --
    
    CREATE TABLE `lupa_password` (
      `forgot_id` int(10) UNSIGNED NOT NULL,
      `mail` varchar(254) NOT NULL COMMENT 'email permintaan',
      `hash` varchar(32) NOT NULL COMMENT 'hash yang dihasilkan',
      `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'status link'
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
    -- --------------------------------------------------------
    
    --
    -- Struktur dari tabel `user`
    --
    
    CREATE TABLE `user` (
      `id` int(10) UNSIGNED NOT NULL,
      `mail` varchar(255) NOT NULL COMMENT 'email pengguna',
      `username` varchar(65) NOT NULL COMMENT 'username pengguna',
      `pass` varchar(255) NOT NULL COMMENT 'password hash'
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
    --
    -- Dumping data untuk tabel `user`
    --
    
    INSERT INTO `user` (`id`, `mail`, `username`, `pass`) VALUES
    (4, 'myroot593@gmail.com', 'user_1', '$2y$10$Bja8EV1M5T0LUf./ZmQXAu.cK15PBcC.hO1ZzXW4NjSAebLrp2SrO');
    
    --
    -- Indexes for dumped tables
    --
    
    --
    -- Indexes for table `lupa_password`
    --
    ALTER TABLE `lupa_password`
      ADD PRIMARY KEY (`forgot_id`),
      ADD KEY `forgot_id` (`forgot_id`);
    
    --
    -- Indexes for table `user`
    --
    ALTER TABLE `user`
      ADD PRIMARY KEY (`id`),
      ADD KEY `id` (`id`);
    
    --
    -- AUTO_INCREMENT for dumped tables
    --
    
    --
    -- AUTO_INCREMENT for table `lupa_password`
    --
    ALTER TABLE `lupa_password`
      MODIFY `forgot_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
    --
    -- AUTO_INCREMENT for table `user`
    --
    ALTER TABLE `user`
      MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;
  2. Buatlah sebuah koneksi database. File db.php
    
      <?php 
    class koneksi
    {
    	private $host="localhost";
    	private $user="root";
    	private $db = "latihan";
    	private $pass="";
    	protected $link;
    	public function __construct()
    	{
    		$this->link = new mysqli($this->host, $this->user, $this->pass, $this->db);
    		if($this->link==false)
    		{
    			die("Gagal melakukan koneksi.".$this->link->connect_error());
    		}
    		return $this->link;
    	}
    }
    
    
      
  3. Buatlah sebuah fungsi untuk menangani proses lupa password, Anda bisa membuatnya seperti berikut : file function.php
    
      <?php 
    class forgot extends koneksi
    {
    	public function cekUsermail($data)
    	{
    		$sql="SELECT mail FROM user WHERE mail =?";
    		if($stmt=$this->link->prepare($sql)):
    			$stmt->bind_param("s",$param_email);
    			$param_email=$data;
    			if($stmt->execute()):
    				$stmt->store_result();
    				if($stmt->num_rows==1):
    					return true;
    				else:
    					return false;
    				endif;
    			endif;
    		endif;
    		
    	}
    	public function insertForgotpass($mail, $hash)
    	{
    		$sql ="INSERT INTO lupa_password (mail, hash) VALUES(?,?)";
    		if($stmt=$this->link->prepare($sql))
    		{
    			$stmt->bind_param("ss",$param_mail, $param_hash);
    			$param_mail=$mail;
    			$param_hash=$hash;
    		
    			if($stmt->execute())
    			{
    				return true;
    			}
    			else
    			{
    				return false;
    			}
    
    		}
    	}
    	public function createNewpass($mail,$pass)
    	{
    		
    		$sql="UPDATE user SET pass=? WHERE mail=?";
    		if($stmt=$this->link->prepare($sql))
    		{
    			$stmt->bind_param("ss",$param_pass, $param_mail);
    			$param_mail=$mail;
    			$param_pass=password_hash($pass, PASSWORD_DEFAULT);
    			
    		
    			if($stmt->execute())
    			{
    				return true;
    			}
    			else
    			{
    				return false;
    			}
    
    		}
    	}
    	public function confirm($mail, $hash)
    	{
    		$sql = "SELECT mail, hash FROM lupa_password WHERE mail=? AND hash=? AND status=0";
    		if($stmt=$this->link->prepare($sql))
    		{
    			$stmt->bind_param("ss",$param_mail, $param_hash);
    			$param_mail=$mail;
    			$param_hash=$hash;
    		
    			if($stmt->execute())
    			{
    				$stmt->store_result();
    				if($stmt->num_rows==1)
    				{
    					return true;
    				}
    				else
    				{
    					return false;
    				}
    			}
    
    		}
    	}
    	public function setStatus_confirm($mail)
    	{
    		$sql = "UPDATE lupa_password SET status=1 WHERE mail=?";
    		if($stmt=$this->link->prepare($sql))
    		{
    			$stmt->bind_param("s",$param_mail);
    			$param_mail=$mail;
    			if($stmt->execute())
    			{
    				return true;
    
    			}
    			else
    			{
    				return false;
    			}
    		}
    	}
    	public function readerror($err)
    	{
    		foreach ($err as $error) {
    			return '<span style="color:red">'.$error.'</span>';
    		}
    	}
    	public function __destruct()
    	{
    		return true;
    	}
    }
      
  4. Selanjutnya buatlah halaman sebuah index.php, dan buat seperti berikut ini
  5. 
      <?php 
    	require_once 'db.php';
    	require_once 'function.php';
    
    	$forgot = new forgot;
    
    	$err = array();
    	$berhasil ="";
    	if($_SERVER['REQUEST_METHOD']=='POST')
    	{
    		if(empty($_POST['mail']))
    		{
    			array_push($err,"Harap masukan email");
    		}
    		else
    		{
    			
    			if($forgot->cekUsermail($_POST['mail']))
    			{
    				$mail = $_POST['mail'];
    				//membuat hash 6 digit dienkripsi oleh md5
    				$hash = md5(rand(100,1000));
    			}
    			else
    			{
    				
    				array_push($err, "email Tidak ditemukan !");
    			}
    		}
    		if(count($err)==0)
    		{
    			if($forgot->insertForgotpass($mail, $hash))
    			{
    				
    				$to = $mail;
    				$from = "admin@".$_SERVER['SERVER_NAME']."";
    				$subject ="Reset Password";
    				$pesan ='Anda telah melakukan perminataan reset password'."\r\n";
    				$pesan.='Anda bisa mengklik tautan dibawah ini'."\r\n";
    				$pesan.='======================='."\r\n";
    				$pesan.='http://'.$_SERVER['SERVER_NAME'].'/confirm.php?mail='.$mail.'&hash='.$hash.''."\r\n";
    				$pesan.='======================='."\r\n";
    				$pesan.='Jika ini bukan Anda, silahkan untuk mengabaikan'."\r\n";
    				$headers=$from;
    				if(mail($to, $subject, $pesan, $headers))
    				{
    					$berhasil = "Link reset telah dikirim ke email Anda";
    				}
    				else
    				{
    					$berhasil = "Gagal mengirim email";
    				}
    			}
    			else
    			{
    				$berhasil = "Gagal membuat link konformasi reset password";
    			}
    		}
    
    	}
    ?>
    <!DOCTYPE html>
    <html>
    <head>
    	<title>Lupa Password - Pengguna root93</title>
    </head>
    <body>
    	
    	<form action="<?php htmlspecialchars($_SERVER['PHP_SELF']);?>" method="post">
    
    		<h4>Tutorial PHP : Mengirim reset password ke email - root93.co.id</h4>
    		<label>Email :</label>
    		<input type="text" name="mail" placeholder="Masukan email">
    		<input type="submit" name="kirim" value="kirim">
    		<br>
    		<?=$berhasil;?>
    		<?php 
    			if(count($err)>0)
    			{
    				echo $forgot->readerror($err);
    			}
    			echo "<br/>";
    
    		?>
    
    		
    	</form>
    	<?php 
    
    		
    
    
    	?>
    </body>
    </html>
      
  6. Terakhir, buat halaman konfirmasi password seperti berikut ini
    
      <?php 
    
    require_once 'db.php';
    require_once 'function.php';
    $forgot = new forgot;
    
    if(isset($_GET['mail']) && !empty($_GET['mail']) AND isset($_GET['hash']) && !empty($_GET['hash']))
    {
    
    	if($forgot->confirm($_GET['mail'], $_GET['hash']))
    	{
    		//jika data ditemukan, set status lupa password ke 1
    		//untuk menandai bahwa nilai tersebut sudah digunakan 
    		//lalu buat password baru
    
    		//set table status request lupa password menjadi satu
    		//untuk menandai bahwa request tersebut sdh berhasil dilaksanakan
    		if($forgot->setStatus_confirm($_GET['mail']))
    		{
    			$pass = rand(100,1000); //password baru
    			if($forgot->createNewpass($_GET['mail'],$pass))
    			{
    				//jika password berhasil dibua, lakukan pengiriman email
    				$to = $_GET['mail'];
    				$from = "admin@".$_SERVER['SERVER_NAME']."";
    				$subject ="Informasi login baru";
    				$pesan ='Anda telah melakukan perminataan reset password'."\r\n";
    				$pesan.='Berikut ini adalah informasi login baru Anda'."\r\n";
    				$pesan.='======================='."\r\n";
    				$pesan.='email ='.$_GET['mail'].''."\r\n";
    				$pesan.='Pass='.$pass.''."\r\n";
    				$pesan.='======================='."\r\n";
    				$headers = $from;
    				if(mail($to, $subject, $pesan, $headers))
    				{
    					echo "Silahkan cek email untuk melihat informasi login terbaru Anda";
    				}
    				else
    				{
    					echo "Gagal mengirim password baru ke email";
    				}
    
    			}
    			else
    			{
    				echo "Password baru gagal dibuat";
    			}
    		}
    		else
    		{
    			echo "Gagal mengeset status permintaan";
    		}
    	}
    	else
    	{
    		echo "Kami tidak bisa menemukan data Anda";
    	}
    }
    else
    {
    	echo "Tidak ada data untuk dicek";
    }
    
    ?>
      

0 Response to "Tutorial PHP : Mengirim Link Reset Lupa Password ke Email"

Post a Comment

Silahkan untuk meninggalkan komentar, santai saja dan mulailah berkomentar...