Maison > Article > développement back-end > Méthode simple PHP pour implémenter la fonction de récupération du mot de passe des membres
Cet article présente principalement comment implémenter simplement la fonction de récupération du mot de passe des membres en PHP. Les amis intéressés peuvent s'y référer. J'espère qu'il sera utile à tout le monde.
Idées de paramétrage
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 trouve 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 front-end pour le traitement de 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="提 交"></p>
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, s'il est correct, il envoie une requête Ajax en arrière-plan, sendmail.php est responsable. pour vérifier si l'adresse e-mail existe et envoyer l'e-mail, et renverra Les résultats du traitement correspondant sont donnés en 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=='' || !preg.test(email)){ $("#chkmsg").html("请填写正确的邮箱!"); }else{ $("#sub_btn").attr("disabled","disabled").val('提交中..').css("cursor","default"); $.post("sendmail.php",{mail:email},function(msg){ if(msg=="noreg"){ $("#chkmsg").html("该邮箱尚未注册!"); $("#sub_btn").removeAttr("disabled").val('提 交').css("cursor","pointer"); }else{ $(".demo").html("<h3>"+msg+"</h3>"); } }); } }); })
Utilisez ce qui précède Le code jQuery est très pratique et concis pour terminer l'opération interactive frontale Si vous avez une certaine base jQuery, ce qui précède. le code est clair en un coup d’œil et ne nécessite pas beaucoup d’explications.
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 utilisateur et ajoutez-les. l'identifiant d'utilisateur, le nom d'utilisateur et le mot de passe sont réveillés par le cryptage md5 pour générer une chaîne spéciale comme code de vérification pour récupérer le mot de passe, puis construire l'URL. 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['mail'])); $sql = "select id,username,password from `t_user` where `email`='$email'"; $query = mysql_query($sql); $num = mysql_num_rows($query); if($num==0){//该邮箱尚未注册! echo 'noreg'; exit; }else{ $row = mysql_fetch_array($query); $getpasstime = time(); $uid = $row['id']; $token = md5($uid.$row['username'].$row['password']);//组合验证码 $url = "/demo/resetpass/reset.php?email=".$email." &token=".$token;//构造URL $time = date('Y-m-d H:i'); $result = sendmail($time,$email,$url); if($result==1){//邮件发送成功 $msg = '系统已向您的邮箱发送了一封邮件<br/>请登录到您的邮箱及时重置您的密码!'; //更新数据发送时间 mysql_query("update `t_user` set `getpasstime`='$getpasstime' where id='$uid '"); }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.jb51.net - 找回密码"; $emailbody = "亲爱的".$email.":<br/>您在".$time."提交了找回密码请求。请点击下面的链接重置密码 (按钮24小时内有效)。<br/><a href='".$url."'target='_blank'>".$url."</a>"; $rs = $smtp->sendmail($smtpemailto, $smtpemailfrom, $emailsubject, $emailbody, $emailtype); return $rs; }
D'accord, à ce moment vous recevrez un email de Helloweba L'e-mail de récupération de mot de passe contient un lien URL dans le contenu de l'e-mail. Cliquez sur le lien pour réinitialiser.php pour vérifier votre e-mail.
Le code est le suivant
include_once("connect.php");//连接数据库 $token = stripslashes(trim($_GET['token'])); $email = stripslashes(trim($_GET['email'])); $sql = "select * from `t_user` where email='$email'"; $query = mysql_query($sql); $row = mysql_fetch_array($query); if($row){ $mt = md5($row['id'].$row['username'].$row['password']); if($mt==$token){ if(time()-$row['getpasstime']>24*60*60){ $msg = '该链接已过期!'; }else{ //重置密码... $msg = '请重新设置密码,显示重置密码表单,<br/>这里只是演示,略过。'; } }else{ $msg = '无效的链接'; } }else{ $msg = '错误的链接!'; } echo $msg;
reset.php accepte d'abord les paramètres email et token, et puis interroge les données en fonction de l'e-mail si l'e-mail existe dans la table t_user, si c'est le cas, obtenez les informations de l'utilisateur et construisez la valeur du jeton de la même manière que la combinaison de jetons dans sendmail.php, puis comparez-la avec le jeton transmis par l'URL. Si l'heure actuelle est la même que l'heure à laquelle l'e-mail a été envoyé, si le décalage horaire est supérieur à 24 heures, le message "Le lien a expiré !" valide et il sera redirigé vers la page de réinitialisation du mot de passe. Enfin, l'utilisateur définira un nouveau mot de passe.
Résumé : Récupérer le mot de passe via la vérification des e-mails enregistrés et l'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. Les applications de vérification par SMS sont également populaires et il suffit de les connecter à l'interface SMS correspondante.
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;
Le code du fichier de classe smtp.class.php
est le suivant
<?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.jb51.net): $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 . " ;"; } } } ?>
Il y a une classe de connexion à la base de données à la fin. Je ne la présenterai pas ici. Vous pouvez trouver les classes mysql de connexion à la base de données pertinentes sur ce site
Résumé : ce qui précède est l'intégralité du contenu de cet article. sera utile à l’apprentissage de chacun.
Recommandations associées :
php Implémentation simple de la communication socket
phpExplication détaillée de deux méthodes d'exportation native de fichiers Excel
php Implémentation du tri temporel de tableaux bidimensionnels
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!