PHP会员找回密码功能实现实例介绍
如果你做的网站有会员系统那必须就自动找回密码功能了,也就是忘记密码功能,如果用户忘记了密码可以通过邮箱或手机号直接找回密码,下面我来介绍邮箱找回密码方法。
设置思路
1、用户注册时需要提供一个E-MAIL邮箱,目的就是用该邮箱找回密码。
2、当用户忘记密码或用户名时,点击登录页面的[找回密码]超链接,打开表单,并输入注册用的E-MAIL邮箱,提交。
3、系统通过该邮箱,从数据库中查找到该用户信息,并更新该用户的密码为一个临时密码(比如:12345678)。
4、系统借助Jmail功能把该用户的信息发送到该用户的邮箱中(内容包括:用户名、临时密码、提醒用户及时修改临时密码的提示语)。
5、用户用临时密码即可登录。
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== '' || !preg.test(email)){ $( "#chkmsg" ).html( "请填写正确的邮箱!" ); } else { $( "#sub_btn" ).attr( "disabled" , "disabled" ).val( '提交中..' ).css( "cursor" , "default" ); $.post( "sendmail.php" ,{mail:email}, function (msg){ if (msg== "noreg" ){ $( "#chkmsg" ).html( "该邮箱尚未注册!" ); $( "#sub_btn" ).removeAttr( "disabled" ).val( '提 交' ).css( "cursor" , "pointer" ); } else { $( ".demo" ).html( "<h3>" +msg+ "</h3>" ); } }); } }); })以上使用的jQuery代码很方便简洁的完成了前端交互操作,如果您有一定的jQuery基础,那上面的代码一目了然,不多解释。
当然别忘了在页面中加载jQuery库文件,有的同学经常问我说从HdhCmsTestphpfensi测试数据下载了demo怎么用不了,那80%是jquery或者其他文件加载路径错了导致没加载必要的文件。
PHP: sendmail.php需要验证Email是否存在系统用户表中,如果有,则读取用户信息,将用户id、用户名和密码惊醒md5加密生成一个特别的字符串作为找回密码的验证码,然后构造URL,同时我们为了控制URL链接的时效性,将记录用户提交找回密码动作的操作时间,最后调用邮件发送类发送邮件到用户邮箱,发送邮件类smtp.class.php已经打包好,请下载,代码如下:
include_once ( "connect.php" ); //连接数据库 $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 = "/demo/resetpass/reset.php?email=" . $email ." &token=". $token ; //构造URL $time = date ( 'Y-m-d H:i' ); $result = sendmail( $time , $email , $url ); if ( $result ==1){ //邮件发送成功 $msg = '系统已向您的邮箱发送了一封邮件<br/>请登录到您的邮箱及时重置您的密码!' ; //更新数据发送时间 mysql_query( "update `t_user` set `getpasstime`='$getpasstime' where id='$uid '" ); } else { $msg = $result ; } echo $msg ; } //发送邮件 function sendmail( $time , $email , $url ){ include_once ( "smtp.class.php" ); $smtpserver = "" ; //SMTP服务器,如smtp.163测试数据 $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 = "HdhCmsTest111cn.net - 找回密码" ; $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链接,点击该链接到HdhCmsTestphpfensi测试数据的reset.php来验证邮箱,代码如下:
include_once ( "connect.php" ); //连接数据库 $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 ;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;smtp.class.php类文件,代码如下:
<?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: $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 . " ;"; } } } ?>最后面有个数据库连接类,这里就不介绍了大大家可以百本站找相关的数据库连接mysql类哦。
查看更多关于PHP会员找回密码功能实现实例介绍 - php高级应用的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did29925