Méthode simple PHP pour implémenter la fonction de récupération du mot de passe des membres

墨辰丷
Libérer: 2023-03-29 07:06:02
original
3604 Les gens l'ont consulté

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>
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, 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==&#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

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[&#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.jb51.net - 找回密码"; 
$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 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[&#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, 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;
Copier après la connexion

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 . "
;";
}
}
}
?>
Copier après la connexion

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!

Étiquettes associées:
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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!