通常所説的密碼找回功能不是真的能把忘記的密碼找回,因為我們的密碼是加密保存的,一般開發者會在驗證用户信息後通過程序生成一個新密碼或者生成一個特定的鏈接併發送郵件到用户郵箱,用户從郵箱鏈接到網站的重置密碼模塊重新設置新密碼。下面是小編為大家帶來的關於如何用PHP實現找回密碼的知識,歡迎閲讀。
如何用PHP實現找回密碼當然現在有的網站也有手機短信的方式找回密碼,原理就是通過發送驗證碼來驗明正身,和發送郵件驗證一樣,最終還是要通過重置密碼來完成找回密碼的流程。
本文將使用PHP+Mysql+jQuery來實現一個密碼找回的功能,一般步驟是:
1.表單輸入註冊時的郵箱;
2.驗證用户郵箱是否正確,如果用户郵箱不存在網站的用户表中,則提示用户郵箱未註冊;
3.發送郵件,如果用户郵箱確實存在用户表中,則組合用於驗證用户信息的字符串,並構造URL發送到用户郵箱中;
4.用户登錄郵箱收取郵件,點擊URL鏈接到網站驗證程序;
5.網站程序通過用户請求的字符串查詢本地用户表,比對用户信息是否正確;
6.如果正確則轉到重置密碼頁面重新設置新密碼,反之則提示用户驗證無效。
我們在找回密碼的頁面上放置一個要求用户輸入註冊時所用的郵箱,然後提交前台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先驗證郵箱格式是否正確,如果正確則通過向後台發送Ajax請求,負責驗證郵箱是否存在和發送郵件,並會返回相應的處理結果給前台頁面,請看jQuery代碼:
$(function(){
$("#sub_btn")k(function(){
var email = $("#email")();
var preg = /^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*/; //匹配Email
if(email=='' || !(email)){
$("#chkmsg")("請填寫正確的郵箱!");
}else{
$("#sub_btn")("disabled","disabled")('提交中..')("cursor","default");
$("",{mail:email},function(msg){
if(msg=="noreg"){
$("#chkmsg")("該郵箱尚未註冊!");
$("#sub_btn")veAttr("disabled")('提 交')("cursor","pointer");
}else{
$("")("<h3>"+msg+"</h3>");
}
});
}
});
})
以上使用的ry代碼很方便簡潔的完成了前端交互操作,如果您有一定的jQuery基礎,那上面的代碼一目瞭然,不多解釋。
當然別忘了在頁面中加載jQuery庫文件,有的同學經常問我説從下載了demo怎麼用不了,那80%是jquery或者其他文件加載路徑錯了導致沒加載必要的文件。
需要驗證Email是否存在系統用户表中,如果有,則讀取用户信息,將用户id、用户名和密碼驚醒md5加密生成一個特別的字符串作為找回密碼的驗證碼,然後構造URL。同時我們為了控制URL鏈接的時效性,將記錄用户提交找回密碼動作的操作時間,最後調用郵件發送類發送郵件到用户郵箱:
include_once("");//連接數據庫
$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 = "$email."
&token=".$token;//構造URL
$time = date('Y-m-d H:i');
$result = sendmail($time,$email,$url);
if($result==1){//郵件發送成功
$msg = '系統已向您的郵箱發送了一封郵件<br/>請登錄到您的郵箱及時重置您的密碼!';
//更新數據發送時間
mysql_query("`t_user` set `getpasstime`='$getpasstime' where id='$uid '");
}else{
$msg = $result;
}
echo $msg;
}
//發送郵件
function sendmail($time,$email,$url){
include_once("");
$smtpserver = ""; //SMTP服務器,如
$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 = " - 找回密碼";
$emailbody = "親愛的".$email.":<br/>您在".$time."提交了找回密碼請求。請點擊下面的鏈接重置密碼
(按鈕24小時內有效)。<br/><a href='".$url."'target='_blank'>".$url."</a>";
$rs = $smtp->sendmail($smtpemailto, $smtpemailfrom, $emailsubject, $emailbody, $emailtype);
return $rs;
}
好了,這個時候你的郵箱將會收到一封來自helloweba的密碼找回郵件,郵件內容中有一個URL鏈接,點擊該鏈接到的來驗證郵箱。
include_once("");//連接數據庫
$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;
首先接受參數email和token,然後根據email查詢數據表t_user中是否存在該Email,如果存在則獲取該用户的信息,並且和中的token組合方式一樣構建token值,然後與url傳過來的token進行對比,如果當前時間與發送郵件時的時間相差超過24小時的,則提示“該鏈接已過期!”,反之,則説明鏈接有效,並且調轉到重置密碼頁面,最後就是用户自己設置新密碼了。
小結:通過註冊郵箱驗證與本文郵件找回密碼,我們知道發送郵件在網站開發中的應用以及它的重要性,當然,現在也流行短信驗證應用,這個需要相關的短信接口對接就可以了。