好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

PHP会员找回密码功能实现实例介绍 - php高级应用

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高级应用的详细内容...

  阅读:49次