1.6 找回密码

1.6.1 找回密码功能概述

找回密码功能用到的技术也是邮箱技术。用户输入正确的账号、密保问题、密保答案后,系统将随机生成的一组数字发送到用户的邮箱中,用户可以通过邮箱来得到新密码。找回密码页面的运行结果如图1.13所示。

图1.13 找回密码页面的运行结果

1.6.2 找回密码功能实现过程

找回密码操作从单击主页中的“找回密码”按钮开始,在弹出的found.php文件中,创建一个表单,提交找回账号、密保问题和密保答案,并且载入xmlhttprequest.js和found.js脚本文件。found.php的关键代码如下:

      <link rel="stylesheet" href="css/style.css" />
      <script language="javascript" src="js/found.js"></script>
      <script language="javascript" src="js/xmlhttprequest.js"></script>
      <div id="fdbgdiv" >
        <div id="top">&nbsp; >>密码找回</div>
        <div id="foundnamediv">找回账号: <input id="foundname" type="text" style="
    width: 100px; height:15px; border:1px #000000 solid; " /></div>
        <div id="foundnamediv">密保问题: <input id="fdquestion" type="text" style="
    width: 100px; height:15px; border:1px #000000 solid; " /></div>
         <div id="foundnamediv">密保答案: <input id="fdanswer" type="text" style=" width:
    100px; height:15px; border:1px #000000 solid; " /></div>
         <div id="foundnamediv" align="center"><button id="step1"></button></div>
       </div>

在found.js文件中,调用found_chk.php文件,完成密码的找回操作,其关键代码如下:

      function $(id){
       return document.getElementById(id);
      }
      window.onload = function(){
       $(' foundname' ).focus();
       $(' step1' ).onclick = function(){
            if($(' foundname' ).value ! = ' ' && $(' fdquestion' ).value ! = ' ' && $
            (' fdanswer' ).value ! = ' ' ){
@@
       xmlhttp.open(' get' , ' found_chk.php? foundname=' +$(' foundname' ).value+' &question
       =' +$(' fdquestion' ).value+' &answer=' +$(' fdanswer' ).value, true);
                xmlhttp.onreadystatechange = function(){
                    if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
                        msg = xmlhttp.responseText;
                        if(msg == '1' ){
                            alert(’找回密码成功,请登录邮箱注册邮箱!' );
                            window.close();
                        }else{
                            alert(’填写信息错误!' );
                        }
                    }
                }
                xmlhttp.send(null);
            }else{
                alert(’请填写完成信息’);
                $(' foundname' ).focus();
                return false;
            }
       }
      }

在found_chk.php文件中,对用户提交的密保问题和密保答案进行验证,如果正确则生成新的密码,并且更新数据库中存储的密码,同时将新密码发送到用户注册时填写的邮箱中。found_chk.php的关键代码如下:

      <? php
       include_once ' conn/conn.php' ;
       require_once ' Zend/Mail.php' ;                  //调用发送邮件的文件
       require_once ' Zend/Mail/Transport/Smtp.php' ;   //调用SMTP验证文件
       $reback = '0' ;
       $name = $_GET[' foundname' ];                    //获取用户名
       $question = $_GET[' question' ];                 //获取密码保护问题
       $answer = $_GET[' answer' ];                     //获取密码保护的答案
       $sql = "select email from tb_member where name = ' ".$name."' and question = ' "
       .$question."' and answer = ' ".$answer."' ";        //定义查询语句
       $email = $conne->getFields($sql,0);              //判断用户提交的用户密保是否正确
       if($email ! = ' ' ){                             //如果正确则执行如下操作
        $rnd = rand(1000, time());                        //生成随机数
        //更新密码
        $sql = "update tb_member set password = ' ".md5($rnd)."' where name =
        '".$name."' and question = ' ".$question."' and answer = ' ".$answer."' ";
        $tmpnum = $conne->uidRst($sql);                   //执行更新操作
        if($tmpnum >= 1){
            //发送密码邮件
            $subject="找回密码";
            $mailbody=’密码找回成功。您账号的新密码是’.$rnd;
            $envelope["from"]="cym3100@163.com";
            //$envelope="mrsoft8888@sohu.com";            //网络版定义登录使用的邮箱
            /*smtp测试版发送邮件方式,使用SMTP作为服务器*/
            $tr = new Zend_Mail_Transport_Smtp('192.168.1.247' );
            $mail = new Zend_Mail();
            $mail->addTo($email, ’获取用户新密码’);
            $mail->setFrom(' cym3100@163.com' , ’明日科技典型模块程序测试邮箱,修改用户
            注册密码!' );
            $mail->setSubject($subject);
            $mail->setBodyHtml($mailbody);
            //$mail->send($tr);
    /*网络版发送邮件方法*/
    /*$config = array(' auth' => ' login' ,
              'username' => ' mrsoft8888' ,
              'password' => ' mrsoft8888' );              //定义SMTP的验证参数
    //实例化验证的对象
    $transport = new Zend_Mail_Transport_Smtp(' smtp.sohu.com' , $config);
    $mail = new Zend_Mail(' GBK' );                       //实例化发送邮件对象
    $mail->setBodyHtml($mailbody);                        //发送邮件主体
    $mail->setFrom($envelope, ’明日科技典型模块程序测试邮箱,修改用户注册密码!' );
    $mail->addTo($email, ’获取用户新密码’);             //定义邮件的接收邮箱
    $mail->setSubject($subject);                          //定义邮件主题
    $mail->send($transport);                              //执行发送操作
    /*网络版发送邮件方法*/
    if(false ==$mail->send($tr) ){
        $reback = ' -1' ;
    }else{
        $reback = '1' ;
    }
    }else{
    $reback = '2' ;
    }
    }else{
    $reback = $sql;
    }
    echo $reback;
    ?>