本文將使用PHP+Mysql+jQuery來實(shí)現(xiàn)一個(gè)密碼找回的功能,分享給大家思路和具體的代碼,有需要的小伙伴可以參考下。
通常所說的密碼找回功能不是真的能把忘記的密碼找回,因?yàn)槲覀兊拿艽a是加密保存的,一般開發(fā)者會(huì)在驗(yàn)證用戶信息后通過程序生成一個(gè)新密碼或者生成一個(gè)特定的鏈接并發(fā)送郵件到用戶郵箱,用戶從郵箱鏈接到網(wǎng)站的重置密碼模塊重新設(shè)置新密碼。
當(dāng)然現(xiàn)在有的網(wǎng)站也有手機(jī)短信的方式找回密碼,原理就是通過發(fā)送驗(yàn)證碼來驗(yàn)明正身,和發(fā)送郵件驗(yàn)證一樣,最終還是要通過重置密碼來完成找回密碼的流程。
一般步驟是:
1.表單輸入注冊(cè)時(shí)的郵箱;
2.驗(yàn)證用戶郵箱是否正確,如果用戶郵箱不存在網(wǎng)站的用戶表中,則提示用戶郵箱未注冊(cè);
3.發(fā)送郵件,如果用戶郵箱確實(shí)存在用戶表中,則組合用于驗(yàn)證用戶信息的字符串,并構(gòu)造URL發(fā)送到用戶郵箱中;
4.用戶登錄郵箱收取郵件,點(diǎn)擊URL鏈接到網(wǎng)站驗(yàn)證程序;
5.網(wǎng)站程序通過用戶請(qǐng)求的字符串查詢本地用戶表,比對(duì)用戶信息是否正確;
6.如果正確則轉(zhuǎn)到重置密碼頁面重新設(shè)置新密碼,反之則提示用戶驗(yàn)證無效。
HTML
我們?cè)谡一孛艽a的頁面上放置一個(gè)要求用戶輸入注冊(cè)時(shí)所用的郵箱,然后提交前臺(tái)js來處理交互。
- <p><strong>輸入您注冊(cè)的電子郵箱,找回密碼:</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
當(dāng)用戶輸入完郵箱并點(diǎn)擊提交后,jQuery先驗(yàn)證郵箱格式是否正確,如果正確則通過向后臺(tái)sendmail.php發(fā)送Ajax請(qǐng)求,sendmail.php負(fù)責(zé)驗(yàn)證郵箱是否存在和發(fā)送郵件,并會(huì)返回相應(yīng)的處理結(jié)果給前臺(tái)頁面,請(qǐng)看jQuery代碼:
- $(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("請(qǐng)?zhí)顚懻_的郵箱!");
- }else{
- $("#sub_btn").attr("disabled","disabled").val('提交中..').css("cursor","default");
- $.post("sendmail.php",{mail:email},function(msg){
- if(msg=="noreg"){
- $("#chkmsg").html("該郵箱尚未注冊(cè)!");
- $("#sub_btn").removeAttr("disabled").val('提 交').css("cursor","pointer");
- }else{
- $(".demo").html("<h3>"+msg+"</h3>");
- }
- });
- }
- });
- })
以上使用的jQuery代碼很方便簡(jiǎn)潔的完成了前端交互操作,如果您有一定的jQuery基礎(chǔ),那上面的代碼一目了然,不多解釋。
當(dāng)然別忘了在頁面中加載jQuery庫文件,有的同學(xué)經(jīng)常問我說從vevb.com下載了demo怎么用不了,那80%是jquery或者其他文件加載路徑錯(cuò)了導(dǎo)致沒加載必要的文件。
PHP
sendmail.php需要驗(yàn)證Email是否存在系統(tǒng)用戶表中,如果有,則讀取用戶信息,將用戶id、用戶名和密碼驚醒md5加密生成一個(gè)特別的字符串作為找回密碼的驗(yàn)證碼,然后構(gòu)造URL。同時(shí)我們?yōu)榱丝刂芔RL鏈接的時(shí)效性,將記錄用戶提交找回密碼動(dòng)作的操作時(shí)間,最后調(diào)用郵件發(fā)送類發(fā)送郵件到用戶郵箱,發(fā)送郵件類smtp.class.php已經(jīng)打包好,請(qǐng)下載。
- include_once("connect.php");//連接數(shù)據(jù)庫
- $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){//該郵箱尚未注冊(cè)!
- echo 'noreg';
- exit;
- }else{
- $row = mysql_fetch_array($query);
- $getpasstime = time();
- $uid = $row['id'];
- $token = md5($uid.$row['username'].$row['password']);//組合驗(yàn)證碼
- $url = "http://www.companysz.com/demo/resetpass/reset.php?email=".$email."
- &token=".$token;//構(gòu)造URL
- $time = date('Y-m-d H:i');
- $result = sendmail($time,$email,$url);
- if($result==1){//郵件發(fā)送成功
- $msg = '系統(tǒng)已向您的郵箱發(fā)送了一封郵件<br/>請(qǐng)登錄到您的郵箱及時(shí)重置您的密碼!';
- //更新數(shù)據(jù)發(fā)送時(shí)間
- mysql_query("update `t_user` set `getpasstime`='$getpasstime' where id='$uid '");
- }else{
- $msg = $result;
- }
- echo $msg;
- }
- //發(fā)送郵件
- function sendmail($time,$email,$url){
- include_once("smtp.class.php");
- $smtpserver = ""; //SMTP服務(wù)器,如smtp.163.com
- $smtpserverport = 25; //SMTP服務(wù)器端口
- $smtpusermail = ""; //SMTP服務(wù)器的用戶郵箱
- $smtpuser = ""; //SMTP服務(wù)器的用戶帳號(hào)
- $smtppass = ""; //SMTP服務(wù)器的用戶密碼
- $smtp = new Smtp($smtpserver, $smtpserverport, true, $smtpuser, $smtppass);
- //這里面的一個(gè)true是表示使用身份驗(yàn)證,否則不使用身份驗(yàn)證.
- $emailtype = "HTML"; //信件類型,文本:text;網(wǎng)頁:HTML
- $smtpemailto = $email;
- $smtpemailfrom = $smtpusermail;
- $emailsubject = "vevb.com - 找回密碼";
- $emailbody = "親愛的".$email.":<br/>您在".$time."提交了找回密碼請(qǐng)求。請(qǐng)點(diǎn)擊下面的鏈接重置密碼
- (按鈕24小時(shí)內(nèi)有效)。<br/><a href='".$url."'target='_blank'>".$url."</a>";
- $rs = $smtp->sendmail($smtpemailto, $smtpemailfrom, $emailsubject, $emailbody, $emailtype);
- return $rs;
- }
好了,這個(gè)時(shí)候你的郵箱將會(huì)收到一封來自helloweba的密碼找回郵件,郵件內(nèi)容中有一個(gè)URL鏈接,點(diǎn)擊該鏈接到vevb.com的reset.php來驗(yàn)證郵箱。
- include_once("connect.php");//連接數(shù)據(jù)庫
- $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 = '請(qǐng)重新設(shè)置密碼,顯示重置密碼表單,<br/>這里只是演示,略過。';
- }
- }else{
- $msg = '無效的鏈接';
- }
- }else{
- $msg = '錯(cuò)誤的鏈接!';
- }
- echo $msg;
reset.php首先接受參數(shù)email和token,然后根據(jù)email查詢數(shù)據(jù)表t_user中是否存在該Email,如果存在則獲取該用戶的信息,并且和sendmail.php中的token組合方式一樣構(gòu)建token值,然后與url傳過來的token進(jìn)行對(duì)比,如果當(dāng)前時(shí)間與發(fā)送郵件時(shí)的時(shí)間相差超過24小時(shí)的,則提示“該鏈接已過期!”,反之,則說明鏈接有效,并且調(diào)轉(zhuǎn)到重置密碼頁面,最后就是用戶自己設(shè)置新密碼了。
小結(jié):通過注冊(cè)郵箱驗(yàn)證與本文郵件找回密碼,我們知道發(fā)送郵件在網(wǎng)站開發(fā)中的應(yīng)用以及它的重要性,當(dāng)然,現(xiàn)在也流行短信驗(yàn)證應(yīng)用,這個(gè)需要相關(guān)的短信接口對(duì)接就可以了。
最后,附上數(shù)據(jù)表t_user結(jié)構(gòu):
- 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;
以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。
新聞熱點(diǎn)
疑難解答