PHP結(jié)合jQuery實(shí)現(xiàn)找回密碼
通常所說的密碼找回功能不是真的能把忘記的密碼找回,因?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代碼很方便簡潔的完成了前端交互操作,如果您有一定的jQuery基礎(chǔ),那上面的代碼一目了然,不多解釋。
當(dāng)然別忘了在頁面中加載jQuery庫文件,有的同學(xué)經(jīng)常問我說從jb51.net下載了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.dhdzp.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 = "jb51.net - 找回密碼";
$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)擊該鏈接到j(luò)b51.net的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;
以上所述就是本文的全部內(nèi)容了,希望大家能夠喜歡。
- jQuery MD5加密實(shí)現(xiàn)代碼
- jQuery ajax MD5實(shí)現(xiàn)用戶注冊(cè)即時(shí)驗(yàn)證功能
- jquery插件開發(fā)之實(shí)現(xiàn)md5插件
- 基于JQuery的密碼強(qiáng)度驗(yàn)證代碼
- jquery判斷輸入密碼兩次是否相等
- jQuery判斷密碼強(qiáng)度實(shí)現(xiàn)思路及代碼
- 密碼框顯示提示文字jquery示例
- jquery密碼強(qiáng)度校驗(yàn)
- jQuery實(shí)現(xiàn)提示密碼強(qiáng)度的代碼
- jQuery實(shí)現(xiàn)密?;コ鈫栴}解決方案
- jQuery隨機(jī)密碼生成的方法
- jQuery插件passwordStrength密碼強(qiáng)度指標(biāo)詳解
- jQuery簡單實(shí)現(xiàn)MD5加密的方法
相關(guān)文章
php數(shù)組函數(shù)序列之a(chǎn)rray_unshift() 在數(shù)組開頭插入一個(gè)或多個(gè)元素
array_unshift() 函數(shù)在數(shù)組開頭插入一個(gè)或多個(gè)元素。被加上的元素作為一個(gè)整體添加,這些元素在數(shù)組中的順序和在參數(shù)中的順序一樣2011-11-11
使用PHP socke 向指定頁面提交數(shù)據(jù)
一直以為有了ajax別人網(wǎng)站的數(shù)據(jù)就可以拿過來用,這也是我這幾天想的一個(gè)方像,但是用了firefox測(cè)試之后,現(xiàn)在不能,2008-07-07
PHP與Java對(duì)比學(xué)習(xí)日期時(shí)間函數(shù)
本文給大家介紹的是從Java和PHP進(jìn)行對(duì)比復(fù)習(xí)了下日期時(shí)間的處理函數(shù),并給出了一些示例,希望對(duì)大家能夠有所幫助2016-07-07
基于PHP實(shí)現(xiàn)郵箱驗(yàn)證激活過程詳解
這篇文章主要介紹了基于PHP實(shí)現(xiàn)郵箱驗(yàn)證激活過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10
PHP實(shí)現(xiàn)Redis分布式鎖的示例代碼
并發(fā)寫入問題可能導(dǎo)致數(shù)據(jù)不一致或重復(fù)寫入,為了解決這個(gè)問題,我們可以使用Redis實(shí)現(xiàn)分布式鎖,本文主要為大家介紹了PHP實(shí)現(xiàn)Redis分布式鎖的相關(guān)知識(shí),希望對(duì)大家有所幫助2023-12-12
PHP下使用CURL方式POST數(shù)據(jù)至API接口的代碼
PHP下使用curl方式post數(shù)據(jù)至api接口的方法,大部分的API的HTTP請(qǐng)求方式都為GET,所以不管用AJAX和PHP二次處理都能拿到返回的數(shù)據(jù),但是一些API的HTTP請(qǐng)求方式是POST,那么我們就需要使用到curl了2013-02-02

