首頁 >後端開發 >PHP問題 >php如何實現忘記密碼找回密碼的功能

php如何實現忘記密碼找回密碼的功能

藏色散人
藏色散人原創
2020-11-24 10:07:503538瀏覽

php實作忘記密碼的功能方法:先透過表單輸入註冊時的信箱;然後驗證使用者信箱是否正確;接著驗證使用者資訊的字串,並建構URL傳送到使用者信箱中;最後實作用戶登入郵箱收取郵件,並進入重設密碼頁面重新設定新密碼即可。

php如何實現忘記密碼找回密碼的功能

推薦:《PHP影片教學

本教學操作環境:windows7系統、PHP5.6版,此方法適用於所有品牌電腦。

PHP Mysql jQuery實作一個密碼找回的功能

#當然現在有的網站也有手機簡訊的方式找回密碼,原理就是透過發送驗證碼來驗明正身,和發送郵件驗證一樣,最後還是要透過重設密碼來完成找回密碼的流程。

本文將使用PHP Mysql jQuery來實現一個密碼找回的功能,一般步驟是:

1.表單輸入註冊時的郵箱;

2.驗證用戶郵箱是否正確,如果使用者郵箱不存在網站的使用者表中,則提示使用者郵箱未註冊;

#3.發送郵件,如果使用者郵箱確實存在使用者表中,則組合用於驗證使用者資訊的字串,並建構URL傳送到使用者信箱;

4.使用者登入信箱收取郵件,點選URL連結到網站驗證程式;

5.網站程式透過使用者請求的字串查詢本機使用者表,比對使用者資訊是否正確;

6.如果正確則前往重設密碼頁面重新設定新密碼,反之則提示使用者驗證無效。

HTML

我們在找回密碼的頁面上放置一個要求使用者輸入註冊時所使用的郵箱,然後提交前台js來處理互動。

<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

當使用者輸入完郵箱並點擊提交後,jQuery先驗證郵箱格式是否正確,如果正確則透過向後台sendmail.php發送Ajax請求,sendmail.php負責驗證郵箱是否存在和發送郵件,並會返回相應的處理結果給前台頁面,請看jQuery代碼:

$(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>");
}
});
}
});
})

以上使用的jQuery代碼很方便簡潔的完成了前端交互操作,如果您有一定的jQuery基礎,那上面的程式碼一目了然,不多解釋。

當然別忘了在頁面中載入jQuery庫文件,有的同學常問我說從helloweba.net下載了demo怎麼用不了,那80%是jquery或其他文件載入路徑錯了導致沒加載必要的文件。

PHP

sendmail.php需要驗證Email是否存在系統使用者表中,如果有,則讀取使用者訊息,將使用者id、使用者名稱和密碼驚醒md5加密產生一個特別的字符字串作為找回密碼的驗證碼,然後建構URL。同時我們為了控制URL連結的時效性,將記錄使用者提交找回密碼動作的操作時間,最後呼叫郵件發送類別發送郵件到使用者信箱,發送郵件類別smtp.class.php已經打包好,請下載。

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 = "http://www.helloweba.net/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 = "Helloweba.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;
}

好了,這個時候你的郵箱將會收到一封來自helloweba的密碼找回郵件,郵件內容中有一個URL鏈接,點擊該鏈接到helloweba.net的reset.php來驗證郵箱。

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;

reset.php先接受參數email和token,然後根據email查詢資料表t_user中是否存在該Email,如果存在則獲取該使用者的信息,並且和sendmail.php中的token組合方式一樣建立token值,然後與url傳過來的token進行對比,如果當前時間與發送郵件時的時間相差超過24小時的,則提示“該鏈接已過期!”,反之,則說明鏈接有效,並且調轉到重置密碼頁面,最後就是使用者自己設定新密碼了。

小結:透過註冊郵箱驗證與本文郵件找回密碼,我們知道發送郵件在網站開發中的應用以及它的重要性,當然,現在也流行短信驗證應用,這個需要相關的短信接口對接就可以了。

最後,附上資料表t_user結構:

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;

以上是php如何實現忘記密碼找回密碼的功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn