Maison > développement back-end > Problème PHP > Comment implémenter la fonction de récupération de mot de passe oublié en php

Comment implémenter la fonction de récupération de mot de passe oublié en php

藏色散人
Libérer: 2023-03-07 15:46:01
original
4714 Les gens l'ont consulté

Comment implémenter la fonction de récupération de mot de passe oublié en PHP : 1. Les utilisateurs doivent fournir un E-MAIL lors de l'inscription 2. Ouvrez le formulaire et saisissez l'E-MAIL pour l'enregistrement 3. Recherchez-le dans le base de données Les informations utilisateur et mettre à jour le mot de passe de l'utilisateur avec un mot de passe temporaire ; 4. Utilisez la fonction Jmail pour modifier le mot de passe.

Comment implémenter la fonction de récupération de mot de passe oublié en php

L'environnement d'exploitation de ce tutoriel : système Windows 10, php5.6 Cet article est applicable à toutes les marques d'ordinateurs.

Recommandé : "Tutoriel vidéo PHP"

Implémentation simple de la fonction de récupération de mot de passe des membres PHP

Idées de définition

1. Les utilisateurs doivent fournir un E-MAIL lors de leur inscription. Le but est d'utiliser cet e-mail pour récupérer le mot de passe.

2. Lorsque l'utilisateur oublie son mot de passe ou son nom d'utilisateur, cliquez sur le lien hypertexte « Récupérer le mot de passe » sur la page de connexion, ouvrez le formulaire, saisissez l'adresse e-mail utilisée pour l'inscription et soumettez.

3. Le système recherche les informations utilisateur dans la base de données via la boîte aux lettres et met à jour le mot de passe de l'utilisateur avec un mot de passe temporaire (par exemple : 12345678).

4. Le système utilise la fonction Jmail pour envoyer les informations de l'utilisateur à la boîte aux lettres de l'utilisateur (le contenu comprend : le nom d'utilisateur, le mot de passe temporaire et une invite pour rappeler à l'utilisateur de modifier le mot de passe temporaire à temps).

5. Les utilisateurs peuvent se connecter avec un mot de passe temporaire.

HTML

Nous plaçons une page sur la page de récupération du mot de passe qui demande à l'utilisateur de saisir l'adresse e-mail utilisée pour l'inscription, puis de soumettre le js frontal pour gérer l'interaction.

Le code est le suivant

<p><strong>輸入您註冊的電子郵箱,找回密碼:</strong></p> 
<p><input type="text" class="input" name="email" id="email"><span id="chkmsg"></span></p> 
<p><input type="button" class="btn" id="sub_btn" value="http://www.bitscn.com/pdb/php/201609/提 交"></p>
Copier après la connexion

jQuery

Une fois que l'utilisateur a saisi l'adresse e-mail et cliqué sur Soumettre, jQuery vérifie d'abord si le format de l'e-mail est correct, et s'il est correct, l'envoie en arrière-plan à la requête Ajax sendmail.php, sendmail.php se charge de vérifier l'existence de la boîte aux lettres et d'envoyer les e-mails, et renverra les résultats du traitement correspondant à la première page. Veuillez consulter le code jQuery :

<🎜. >Le code est le suivant

$(function(){ 
$("#sub_btn").click(function(){ 
var email = $("#email").val(); 
var preg = /^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*/; //匹配Email 
if(email==&#39;&#39; || !preg.test(email)){ 
$("#chkmsg").html("請填寫正確的郵箱!"); 
}else{ 
$("#sub_btn").attr("disabled","disabled").val(&#39;提交中..&#39;).css("cursor","default"); 
$.post("sendmail.php",{mail:email},function(msg){ 
if(msg=="noreg"){ 
$("#chkmsg").html("該郵箱尚未註冊!"); 
$("#sub_btn").removeAttr("disabled").val(&#39;提 交&#39;).css("cursor","pointer"); 
}else{ 
$(".demo").html("<h3>"+msg+"</h3>"); 
} 
}); 
} 
}); 
})
Copier après la connexion

Le jQuery utilisé ci-dessus Le code est très pratique et complète de manière concise l'opération interactive frontale Si vous avez une certaine base jQuery, le code ci-dessus est clair en un coup d'œil et nécessite. aucune explication.

Bien sûr, n'oubliez pas de charger le fichier de la bibliothèque jQuery sur la page Certains étudiants me demandent souvent pourquoi ils ne peuvent pas utiliser la démo téléchargée sur Internet dans 80% des cas, c'est à cause du chargement. le chemin de jquery ou d’autres fichiers est erroné, il n’est donc pas nécessaire de le charger.

PHP

sendmail.php doit vérifier si l'e-mail existe dans la table des utilisateurs du système. Si tel est le cas, lisez les informations de l'utilisateur, utilisez le cryptage md5 pour générer un caractère spécial pour l'identifiant de l'utilisateur, nom d'utilisateur et mot de passe. La chaîne est utilisée comme code de vérification pour récupérer le mot de passe, puis l'URL est construite. Dans le même temps, afin de contrôler l'actualité du lien URL, nous enregistrerons l'heure de l'opération lorsque l'utilisateur soumet l'action de récupération du mot de passe, et enfin appellerons la classe d'envoi d'e-mail pour envoyer l'e-mail à la boîte aux lettres de l'utilisateur. la classe smtp.class.php a été empaquetée, veuillez la télécharger.

Le code est le suivant

include_once("connect.php");//連接數據庫 

$email = stripslashes(trim($_POST[&#39;mail&#39;])); 

$sql = "select id,username,password from `t_user` where `email`=&#39;$email&#39;"; 
$query = mysql_query($sql); 
$num = mysql_num_rows($query); 
if($num==0){//該郵箱尚未註冊! 
echo &#39;noreg&#39;; 
exit; 
}else{ 
$row = mysql_fetch_array($query); 
$getpasstime = time(); 
$uid = $row[&#39;id&#39;]; 
$token = md5($uid.$row[&#39;username&#39;].$row[&#39;password&#39;]);//組合驗證碼 
$url = "/demo/resetpass/reset.php?email=".$email." 
&token=".$token;//構造URL 
$time = date(&#39;Y-m-d H:i&#39;); 
$result = sendmail($time,$email,$url); 
if($result==1){//郵件發送成功 
$msg = &#39;系統已向您的郵箱發送了一封郵件<br/>請登錄到您的郵箱及時重置您的密碼!&#39;; 
//更新數據發送時間 
mysql_query("update `t_user` set `getpasstime`=&#39;$getpasstime&#39; where id=&#39;$uid &#39;"); 
}else{ 
$msg = $result; 
} 
echo $msg; 
} 

//發送郵件 
function sendmail($time,$email,$url){ 
include_once("smtp.class.php"); 
$smtpserver = ""; //SMTP服務器,如smtp.163.com 
$smtpserverport = 25; //SMTP服務器端口 
$smtpusermail = ""; //SMTP服務器的用戶郵箱 
$smtpuser = ""; //SMTP服務器的用戶帳號 
$smtppass = ""; //SMTP服務器的用戶密碼 
$smtp = new Smtp($smtpserver, $smtpserverport, true, $smtpuser, $smtppass); 
//這裏面的一個true是表示使用身份驗證,否則不使用身份驗證. 
$emailtype = "HTML"; //信件類型,文本:text;網頁:HTML 
$smtpemailto = $email; 
$smtpemailfrom = $smtpusermail; 
$emailsubject = "www.bitsCN.com - 找回密碼"; 
$emailbody = "親愛的".$email.":<br/>您在".$time."提交了找回密碼請求。請點擊下面的鏈接重置密碼 
(按鈕24小時內有效)。<br/><a href=&#39;".$url."&#39;target=&#39;_blank&#39;>".$url."</a>"; 
$rs = $smtp->sendmail($smtpemailto, $smtpemailfrom, $emailsubject, $emailbody, $emailtype); 

return $rs; 
}
Copier après la connexion

D'accord, à ce moment, votre boîte aux lettres recevra un e-mail de récupération de mot de passe de helloweba. Il y a un lien URL dans le contenu de l'e-mail. php pour vérifier l'e-mail.

Le code est le suivant

include_once("connect.php");//連接數據庫 

$token = stripslashes(trim($_GET[&#39;token&#39;])); 
$email = stripslashes(trim($_GET[&#39;email&#39;])); 
$sql = "select * from `t_user` where email=&#39;$email&#39;"; 

$query = mysql_query($sql); 
$row = mysql_fetch_array($query); 
if($row){ 
$mt = md5($row[&#39;id&#39;].$row[&#39;username&#39;].$row[&#39;password&#39;]); 
if($mt==$token){ 
if(time()-$row[&#39;getpasstime&#39;]>24*60*60){ 
$msg = &#39;該鏈接已過期!&#39;; 
}else{ 
//重置密碼... 
$msg = &#39;請重新設置密碼,顯示重置密碼表單,<br/>這裏只是演示,略過。&#39;; 
} 
}else{ 
$msg = &#39;無效的鏈接&#39;; 
} 
}else{ 
$msg = &#39;錯誤的鏈接!&#39;; 
} 
echo $msg;
Copier après la connexion

reset.php accepte d'abord les paramètres email et token, puis vérifie si l'e-mail existe dans la table de données t_user en fonction de l'e-mail. obtenir les informations de l'utilisateur et communiquer avec sendmail La méthode de combinaison de jetons dans .php construit la valeur du jeton de la même manière, puis la compare avec le jeton transmis par l'URL si la différence entre l'heure actuelle et l'heure à laquelle l'e-mail est envoyé. est envoyé depuis plus de 24 heures, il demandera "Le lien a expiré!", sinon, il indique que le lien est valide et redirige vers la page de réinitialisation du mot de passe. Enfin, l'utilisateur définit un nouveau mot de passe.

Résumé : Grâce à la vérification des e-mails enregistrés et à la récupération du mot de passe par e-mail dans cet article, nous connaissons l'application de l'envoi d'e-mails dans le développement de sites Web et son importance. Bien sûr, les applications de vérification par SMS sont également populaires désormais, qui nécessitent des SMS associés. interfaces Connectez-vous simplement.

Enfin, attachez la structure t_user de la table de données :

Le code est le suivant

CREATE TABLE `t_user` ( 
`id` int(11) NOT NULL auto_increment, 
`username` varchar(30) NOT NULL, 
`password` varchar(32) NOT NULL, 
`email` varchar(50) NOT NULL, 
`getpasstime` int(10) NOT NULL, 
PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Copier après la connexion

fichier de classe smtp.class.php

Le code est le suivant suit

<?php

class Smtp{

/* Public Variables */

var $smtp_port;

var $time_out;

var $host_name;

var $log_file;

var $relay_host;

var $debug;

var $auth;

var $user;

var $pass;

/* Private Variables */
var $sock;

/* Constractor */

function smtp($relay_host = "", $smtp_port = 25, $auth = false, $user, $pass) {
$this->debug = false;

$this->smtp_port = $smtp_port;

$this->relay_host = $relay_host;

$this->time_out = 30; //is used in fsockopen()

$this->auth = $auth; //auth

$this->user = $user;

$this->pass = $pass;

$this->host_name = "localhost"; //is used in HELO command
$this->log_file = "";

$this->sock = false;
}

/* Main Function */

function sendmail($to, $from, $subject = "", $body = "", $mailtype, $cc = "", $bcc = "", $additional_headers = "") {
$mail_from = $this->get_address($this->strip_comment($from));

$body = ereg_replace("(^|(rn))(.)", "1.3", $body);

$header .= "MIME-version:1.0rn";

if ($mailtype == "HTML") {
$header .= "Content-Type:text/htmlrn";
}

$header .= "To: " . $to . "rn";

if ($cc != "") {
$header .= "Cc: " . $cc . "rn";
}

$header .= "From(www.bitsCN.com): $from<" . $from . ">rn";

$header .= "Subject: " . $subject . "rn";

$header .= $additional_headers;

$header .= "Date: " . date("r") . "rn";

$header .= "X-Mailer:By Redhat (PHP/" . phpversion() . ")rn";

list ($msec, $sec) = explode(" ", microtime());

$header .= "message-ID: <" . date("YmdHis", $sec) . "." . ($msec * 1000000) . "." . $mail_from . ">rn";

$TO = explode(",", $this->strip_comment($to));

if ($cc != "") {
$TO = array_merge($TO, explode(",", $this->strip_comment($cc)));
}

if ($bcc != "") {
$TO = array_merge($TO, explode(",", $this->strip_comment($bcc)));
}

$sent = true;

foreach ($TO as $rcpt_to) {
$rcpt_to = $this->get_address($rcpt_to);

if (!$this->smtp_sockopen($rcpt_to)) {
$this->log_write("Error: Cannot send email to " . $rcpt_to . "n");

$sent = false;

continue;
}

if ($this->smtp_send($this->host_name, $mail_from, $rcpt_to, $header, $body)) {
$this->log_write("E-mail has been sent to <" . $rcpt_to . ">n");
} else {
$this->log_write("Error: Cannot send email to <" . $rcpt_to . ">n");

$sent = false;
}

fclose($this->sock);

$this->log_write("Disconnected from remote hostn");
}

return $sent;
}

/* Private Functions */

function smtp_send($helo, $from, $to, $header, $body = "") {
if (!$this->smtp_putcmd("HELO", $helo)) {
return $this->smtp_error("sending HELO command");
}
// auth
if ($this->auth) {
if (!$this->smtp_putcmd("AUTH LOGIN", base64_encode($this->user))) {
return $this->smtp_error("sending HELO command");
}

if (!$this->smtp_putcmd("", base64_encode($this->pass))) {
return $this->smtp_error("sending HELO command");
}
}

if (!$this->smtp_putcmd("MAIL", "FROM:<" . $from . ">")) {
return $this->smtp_error("sending MAIL FROM command");
}

if (!$this->smtp_putcmd("RCPT", "TO:<" . $to . ">")) {
return $this->smtp_error("sending RCPT TO command");
}

if (!$this->smtp_putcmd("DATA")) {
return $this->smtp_error("sending DATA command");
}

if (!$this->smtp_message($header, $body)) {
return $this->smtp_error("sending message");
}

if (!$this->smtp_eom()) {
return $this->smtp_error("sending <CR><LF>.<CR><LF> [EOM]");
}

if (!$this->smtp_putcmd("QUIT")) {
return $this->smtp_error("sending QUIT command");
}

return true;
}

function smtp_sockopen($address) {
if ($this->relay_host == "") {
return $this->smtp_sockopen_mx($address);
} else {
return $this->smtp_sockopen_relay();
}
}

function smtp_sockopen_relay() {
$this->log_write("Trying to " . $this->relay_host . ":" . $this->smtp_port . "n");

$this->sock = @ fsockopen($this->relay_host, $this->smtp_port, $errno, $errstr, $this->time_out);

if (!($this->sock && $this->smtp_ok())) {
$this->log_write("Error: Cannot connenct to relay host " . $this->relay_host . "n");

$this->log_write("Error: " . $errstr . " (" . $errno . ")n");

return false;
}

$this->log_write("Connected to relay host " . $this->relay_host . "n");

return true;
;
}

function smtp_sockopen_mx($address) {
$domain = ereg_replace("^.+@([^@]+)$", "1", $address);

if (!@ getmxrr($domain, $MXHOSTS)) {
$this->log_write("Error: Cannot resolve MX "" . $domain . ""n");

return false;
}

foreach ($MXHOSTS as $host) {
$this->log_write("Trying to " . $host . ":" . $this->smtp_port . "n");

$this->sock = @ fsockopen($host, $this->smtp_port, $errno, $errstr, $this->time_out);

if (!($this->sock && $this->smtp_ok())) {
$this->log_write("Warning: Cannot connect to mx host " . $host . "n");

$this->log_write("Error: " . $errstr . " (" . $errno . ")n");

continue;
}

$this->log_write("Connected to mx host " . $host . "n");

return true;
}

$this->log_write("Error: Cannot connect to any mx hosts (" . implode(", ", $MXHOSTS) . ")n");

return false;
}

function smtp_message($header, $body) {
fputs($this->sock, $header . "rn" . $body);

$this->smtp_debug("> " . str_replace("rn", "n" . "> ", $header . "n> " . $body . "n> "));

return true;
}

function smtp_eom() {
fputs($this->sock, "rn.rn");

$this->smtp_debug(". [EOM]n");

return $this->smtp_ok();
}

function smtp_ok() {
$response = str_replace("rn", "", fgets($this->sock, 512));

$this->smtp_debug($response . "n");

if (!ereg("^[23]", $response)) {
fputs($this->sock, "QUITrn");

fgets($this->sock, 512);

$this->log_write("Error: Remote host returned "" . $response . ""n");

return false;
}

return true;
}

function smtp_putcmd($cmd, $arg = "") {
if ($arg != "") {
if ($cmd == "")
$cmd = $arg;

else
$cmd = $cmd . " " . $arg;
}

fputs($this->sock, $cmd . "rn");

$this->smtp_debug("> " . $cmd . "n");

return $this->smtp_ok();
}

function smtp_error($string) {
$this->log_write("Error: Error occurred while " . $string . ".n");

return false;
}

function log_write($message) {
$this->smtp_debug($message);

if ($this->log_file == "") {
return true;
}

$message = date("M d H:i:s ") . get_current_user() . "[" . getmypid() . "]: " . $message;

if (!@ file_exists($this->log_file) || !($fp = @ fopen($this->log_file, "a"))) {
$this->smtp_debug("Warning: Cannot open log file "" . $this->log_file . ""n");

return false;
;
}

flock($fp, LOCK_EX);

fputs($fp, $message);

fclose($fp);

return true;
}

function strip_comment($address) {
$comment = "([^()]*)";

while (ereg($comment, $address)) {
$address = ereg_replace($comment, "", $address);
}

return $address;
}

function get_address($address) {
$address = ereg_replace("([ trn])+", "", $address);

$address = ereg_replace("^.*<(.+)>.*$", "1", $address);

return $address;
}

function smtp_debug($message) {
if ($this->debug) {
echo $message . "
;";
}
}
}
?>
Copier après la connexion
Il y a une classe de connexion à la base de données à la fin, qui ne sera pas présentée ici. Vous pouvez trouver la classe mysql de connexion à la base de données appropriée sur ce site

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
php
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal