php利用pdo和swiftmailer实现邮箱验证注册

1.登陆、注册代码(html5)

<!DOCTYPE html>
<!--[if lt IE 7 ]> <html class="no-js ie6 lt8"> <![endif]-->
<!--[if IE 7 ]>    <html class="no-js ie7 lt8"> <![endif]-->
<!--[if IE 8 ]>    <html class="no-js ie8 lt8"> <![endif]-->
<!--[if IE 9 ]>    <html class="no-js ie9"> <![endif]-->
<!--[if (gt IE 9)|!(IE)]><!--> <html> <!--<![endif]-->
    <head>
        <meta charset="UTF-8" />
        <!-- <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">  -->
        <title>Login and Registration Form with HTML5 and CSS3</title>
        <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
        <meta name="description" content="Login and Registration Form with HTML5 and CSS3" />
        <meta name="keywords" content="html5, css3, form, switch, animation, :target, pseudo-class" />
        <meta name="author" content="Codrops" />
        <link rel="shortcut icon" href="../favicon.ico"> 
        <link rel="stylesheet" type="text/css" href="css/demo.css" />
        <link rel="stylesheet" type="text/css" href="css/style.css" />
        <link rel="stylesheet" type="text/css" href="css/animate-custom.css" />

    </head>
    <body>
        <div>
            <header>
                <h1>动物管理系统——<span>web版</span></h1>
                <nav>
                    <span>Click <strong>"Join us"</strong> to Register the Imooc</span>
                </nav>
            </header>
            <section>    
            <div>              
                <div id="container_demo" >
                    <a id="toregister"></a>
                    <a id="tologin"></a>
                    <div id="wrapper">
                        <div id="login" class="animate form">
                            <form  action="doAction.php?act=login" autocomplete="on" method="post"> 
                                <h1>Log in</h1> 
                                <p> 
                                    <label for="username" data-icon="u" > Your username </label>
                                    <input id="username" name="username" required="required" type="text" placeholder="My Username"/>
                                </p>
                                <p style="color:red;" id="messgae"></p>
                                <p> 
                                    <label for="password" data-icon="p"> Your password </label>
                                    <input id="password" name="password" required="required" type="password" placeholder="*****" /> 
                                </p>
                                <p> 
                                    <input type="checkbox" name="loginkeeping" id="loginkeeping" value="loginkeeping" /> 
                                    <label for="loginkeeping">Keep me logged in</label>
                                </p>
                                <p class="login button"> 
                                    <input type="submit" value="Login"  onClick="check();"/> 
                                </p>
                                <p>
                                    Not a member yet ?
                                    <a href="#toregister">Join us</a>
                                </p>
                            </form>
                        </div>

                        <div id="register" class="animate form">
                            <form  action="doAction.php?act=reg" autocomplete="on" method="post"> 
                                <h1> Sign up </h1> 
                                <p> 
                                    <label for="usernamesignup" data-icon="u">Your username</label>
                                    <input id="usernamesignup" name="username" required="required" type="text" placeholder="username" />
                                </p>
                                <p> 
                                    <label for="emailsignup" data-icon="e" > Your email</label>
                                    <input id="emailsignup" name="email" required="required" type="email" placeholder="Mr. [email protected]"/> 
                                </p>
                                <p> 
                                    <label for="passwordsignup" data-icon="p">Your password </label>
                                    <input id="passwordsignup" name="password" required="required" type="password" placeholder="******"/>
                                </p>
                                <p class="signin button"> 
                                    <input type="submit" value="Sign up"/> 
                                </p>
                                <p>  
                                    Already a member ?
                                    <a href="#tologin"> Go and log in </a>
                                </p>
                            </form>
                        </div>
                        </div>
                    </div>
                </div>  
            </section>
        </div>
    <!--<script>
document.getElementById("search").onclick = function() { 
    var request = new XMLHttpRequest();
    request.open("GET", "doAction.php?username=" + document.getElementById("username").value);
    request.send();
    request.onreadystatechange = function() {
        if (request.readyState===4) {
            if (request.status===200) { 
                document.getElementById("message").innerHTML = request.responseText;
            } else {
                alert("发生错误:" + request.status);
            }
        } 
    }
}
</script> -->
    </body>
</html>

2、doaction.php

<?php 
header('content-type:text/html;charset=utf-8');
//1.包含所需文件
error_reporting(0);
require_once 'swiftmailer-master/lib/swift_required.php';
require_once 'PdoMySQL.class.php';
require_once 'config.php';
require_once 'pwd.php';
//2.接收信息
$act=$_GET['act'];
$username=addslashes($_POST['username']);
$password=md5($_POST['password']);
$email=$_POST['email'];
$table='user';
//3.得到连接对象
$PdoMySQL=new PdoMySQL();

/*if ($_SERVER["REQUEST_METHOD"] == "GET") {
    search();
}
function search(){
    //检查是否有员工编号的参数
    //isset检测变量是否设置;empty判断值为否为空
    //超全局变量 $_GET 和 $_POST 用于收集表单数据
    if (!isset($_GET["username"]) || empty($_GET["username"])) {
        echo "参数错误";
        return;
    }
    //函数之外声明的变量拥有 Global 作用域,只能在函数以外进行访问。
    //global 关键词用于访问函数内的全局变量
    global $staff;
    //获取number参数

    try{
    $sql='SELECT username,password FROM user';
    $stmt=$pdo->query($sql);
    echo $stmt->fetchColumn(0),'<br/>';
}catch(PDOException $e){
    echo $e->getMessage();
}

    foreach ($stmt as $value) {
        if ($value["username"] == $username) {
            $result = "账号或密码错误";
            break;
        }
    }
    echo $result;
}
*/



if($act==='reg'){
    $regtime=time();
    //完成注册的功能
    $token=md5($username.$password.$regtime);
    $token_exptime=$regtime+24*3600;//过期时间
    $data=compact('username','password','email','token','token_exptime','regtime');
    $res=$PdoMySQL->add($data, $table);
    $lastInsertId=$PdoMySQL->getLastInsertId();
    if($res){
        //发送邮件,以QQ邮箱为例
        //配置邮件服务器,得到传输对象
        $transport=Swift_SmtpTransport::newInstance('smtp.qq.com',25);
        //设置登陆帐号和密码
        $transport->setUsername('[email protected]');
        $transport->setPassword($emailPassword);
        //得到发送邮件对象Swift_Mailer对象
        $mailer=Swift_Mailer::newInstance($transport);
        //得到邮件信息对象
        $message=Swift_Message::newInstance();
        //设置管理员的信息
        $message->setFrom(array('[email protected]'=>'动物管理系统'));
        //将邮件发给谁
        $message->setTo(array($email=>'感谢你注册宠物系统'));
        //设置邮件主题
        $message->setSubject('激活邮件');
        $url="http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']."?act=active&token={$token}";
        $urlencode=urlencode($url);
        $str=<<<EOF
        亲爱的{$username}您好~!感谢您注册我们网站<br/>
        请点击此链接激活帐号即可登陆!<br/>
        <a href="{$url}">{$urlencode}</a>
        <br/>
        如果点此链接无反映,可以将其复制到浏览器中来执行,链接的有效时间为24小时。        
EOF;
        $message->setBody("{$str}",'text/html','utf-8');
        try{
            if($mailer->send($message)){
                echo "恭喜您{$username}注册成功,请到邮箱激活之后登陆<br/>";
                echo '3秒钟后跳转到登陆页面';
                echo '<meta http-equiv="refresh" content="3;url=index.php#tologin"/>';
            }else{
                $PdoMySQL->delete($table,'id='.$lastInsertId);
                echo '注册失败,请重新注册';
                echo '3秒钟后跳转到注册页面';
                echo '<meta http-equiv="refresh" content="3;url=index.php#toregister"/>';
            }
        }catch(Swift_ConnectionException $e){
            echo '邮件发送错误'.$e->getMessage();
        }
    }else{
        echo '用户注册失败,3秒钟后跳转到注册页面';
        echo '<meta http-equiv="refresh" content="3;url=index.php#toregister"/>';
    }
}elseif($act==='login'){
    //完成登陆的功能
    $row=$PdoMySQL->find($table,"username='{$username}' AND password='{$password}'",'status');
    if($row['status']==0){
        echo "账号或密码错误";
        echo '<meta http-equiv="refresh" content="3;url=index.php#tologin"/>';
    }else{
        echo '登陆成功,3秒钟后跳转到首页';
        echo '<meta http-equiv="refresh" content="3;url=http://www.imooc.com"/>';
    }
    
}elseif($act==='active'){
    $token=addslashes($_GET['token']);
    $row=$PdoMySQL->find($table,"token='{$token}' AND status=0",array('id','token_exptime'));
    $now=time();
    if($now>$row['token_exptime']){
        echo '激活时间过期,请重新登陆激活';
    }else{
        $res=$PdoMySQL->update(array('status'=>1),$table,'id='.$row['id']);
        if($res){
            echo '激活成功,3秒钟后跳转到登陆页面';
            echo '<meta http-equiv="refresh" content="3;url=index.php#tologin"/>';
        }else{
            echo '激活失败,请重新激活';
            echo '<meta http-equiv="refresh" content="3;url=index.php"/>';
        }
    }
    
}

3.PdoMySQL.class.php

<?php 
//header('content-type:text/html;charset=utf-8');
class PdoMySQL{
    public static $config=array();//设置连接参数,配置信息
    public static $link=null;//保存连接标识符
    public static $pconnect=false;//是否开启长连接
    public static $dbVersion=null;//保存数据库版本
    public static $connected=false;//是否连接成功
    public static $PDOStatement=null;//保存PDOStatement对象
    public static $queryStr=null;//保存最后执行的操作
    public static $error=null;//报错错误信息
    public static $lastInsertId=null;//保存上一步插入操作产生AUTO_INCREMENT
    public static $numRows=0;//上一步操作产生受影响的记录的条数
    /**
     * 连接PDO
     * @param string $dbConfig
     * @return boolean
     */
    public function __construct($dbConfig=''){
        if(!class_exists("PDO")){
            self::throw_exception('不支持PDO,请先开启');
        }
        if(!is_array($dbConfig)){
            $dbConfig=array(
            'hostname'=>DB_HOST,
            'username'=>DB_USER,
            'password'=>DB_PWD,
            'database'=>DB_NAME,
            'hostport'=>DB_PORT,
            'dbms'=>DB_TYPE,
            'dsn'=>DB_TYPE.":host=".DB_HOST.";dbname=".DB_NAME
            );
        }
        if(empty($dbConfig['hostname']))self::throw_exception('没有定义数据库配置,请先定义');
        self::$config=$dbConfig;
        if(empty(self::$config['params']))self::$config['params']=array();
        if(!isset(self::$link)){
            $configs=self::$config;
            if(self::$pconnect){
                //开启长连接,添加到配置数组中
                $configs['params'][constant("PDO::ATTR_PERSISTENT")]=true;
            }
            try{
                self::$link=new PDO($configs['dsn'],$configs['username'],$configs['password'],$configs['params']);
            }catch(PDOException $e){
                self::throw_exception($e->getMessage());
            }
            if(!self::$link){
                self::throw_exception('PDO连接错误');
                return false;
            }
            self::$link->exec('SET NAMES '.DB_CHARSET);
            self::$dbVersion=self::$link->getAttribute(constant("PDO::ATTR_SERVER_VERSION"));
            self::$connected=true;
            unset($configs);
        }
    }
    
    /**
     * 得到所有记录
     * @param string $sql
     * @return unknown
     */
    public static function getAll($sql=null){
        if($sql!=null){
            self::query($sql);
        }
        $result=self::$PDOStatement->fetchAll(constant("PDO::FETCH_ASSOC"));
        return $result;
    }
    /**
     * 得到结果集中的一条记录
     * @param string $sql
     * @return mixed
     */
    public static function getRow($sql=null){
        if($sql!=null){
            self::query($sql);
        }
        $result=self::$PDOStatement->fetch(constant("PDO::FETCH_ASSOC"));
        return $result;
    }
    /**
     * 根据主键查找记录
     * @param string $tabName
     * @param int $priId
     * @param string $fields
     * @return mixed
     */
    public static function findById($tabName,$priId,$fields='*'){
        $sql='SELECT %s FROM %s WHERE id=%d';
        return self::getRow(sprintf($sql,self::parseFields($fields),$tabName,$priId));
    }
    
    /**
     * 执行普通查询
     * @param unknown $tables
     * @param string $where
     * @param string $fields
     * @param string $group
     * @param string $having
     * @param string $order
     * @param string $limit
     * @return Ambigous <unknown, unknown, multitype:>
     */
    public static function find($tables,$where=null,$fields='*',$group=null,$having=null,$order=null,$limit=null){
        $sql='SELECT '.self::parseFields($fields).' FROM '.$tables
        .self::parseWhere($where)
        .self::parseGroup($group)
        .self::parseHaving($having)
        .self::parseOrder($order)
        .self::parseLimit($limit);
        $dataAll=self::getAll($sql);
        return count($dataAll)==1?$dataAll[0]:$dataAll;
    }
    /*
     array(
     'username'=>'imooc',
     'password'=>'imooc',
     'email'=>'[email protected]',
     'token'=>'123abc',
     'token_exptime'=>'123123',
     'regtime'=>'123456'
     )
     INSERT user(username,password,email,token,token_exptime,regtime) 
     VALUES('aa','aa','[email protected]','bb','123123','123456')
     */
    /**
     * 添加记录的操作
     * @param array $data
     * @param string $table
     * @return Ambigous <boolean, unknown, number>
     */
    public static function add($data,$table){
        $keys=array_keys($data);
        array_walk($keys,array('PdoMySQL','addSpecialChar'));
        $fieldsStr=join(',',$keys);
        $values="'".join("','",array_values($data))."'";
        $sql="INSERT {$table}({$fieldsStr}) VALUES({$values})";
        //echo $sql;
        return self::execute($sql);
    } 
    /*
      array(
     'username'=>'imooc111',
     'password'=>'imooc222',
     'email'=>'[email protected]',
     'token'=>'4444',
     'token_exptime'=>'1234444',
     'regtime'=>'12345678'
     )
     UPDATE user SET username='imooc111',password='imooc222'.... WHERE id<=38 ORDER BY username limit 0,1
     */
    /**
     * 更新记录
     * @param array $data
     * @param string $table
     * @param string $where
     * @param string $order
     * @param string $limit
     * @return Ambigous <boolean, unknown, number>
     */
    public static function update($data,$table,$where=null,$order=null,$limit=0){
        foreach($data as $key=>$val){
            $sets.=$key."='".$val."',";
        }
        //echo $sets;
        $sets=rtrim($sets,',');
        $sql="UPDATE {$table} SET {$sets} ".self::parseWhere($where).self::parseOrder($order).self::parseLimit($limit);
        return self::execute($sql);
    }
    /**
     * 删除记录的操作
     * @param string $table
     * @param string $where
     * @param string $order
     * @param number $limit
     * @return Ambigous <boolean, unknown, number>
     */
    public static function delete($table,$where=null,$order=null,$limit=0){
        $sql="DELETE FROM {$table} ".self::parseWhere($where).self::parseOrder($order).self::parseLimit($limit);
        return self::execute($sql);
    }
    /**
     * 得到最后执行的SQL语句
     * @return boolean|Ambigous <string, string>
     */
    public static function getLastSql(){
        $link=self::$link;
        if(!$link)return false;
        return self::$queryStr;
    }
    /**
     * 得到上一步插入操作产生AUTO_INCREMENT
     * @return boolean|string
     */
    public static function getLastInsertId(){
        $link=self::$link;
        if(!$link)return false;
        return self::$lastInsertId;
    }
    /**
     * 得到数据库的版本
     * @return boolean|mixed
     */
    public static function getDbVerion(){
        $link=self::$link;
        if(!$link)return false;
        return self::$dbVersion;
    }
    /**
     * 得到数据库中数据表
     * @return multitype:mixed 
     */
    public static function showTables(){
        $tables=array();
        if(self::query("SHOW TABLES")){
            $result=self::getAll();
            foreach($result as $key=>$val){
                $tables[$key]=current($val);
            }
        }
        return $tables;
    }
    /**
     * 解析Where条件
     * @param unknown $where
     * @return string
     */
    public static function parseWhere($where){
        $whereStr='';
        if(is_string($where)&&!empty($where)){
            $whereStr=$where;
        }
        return empty($whereStr)?'':' WHERE '.$whereStr;
    }
    /**
     * 解析group by
     * @param unknown $group
     * @return string
     */
    public static function parseGroup($group){
        $groupStr='';
        if(is_array($group)){
            $groupStr.=' GROUP BY '.implode(',',$group);
        }elseif(is_string($group)&&!empty($group)){
            $groupStr.=' GROUP BY '.$group;
        }
        return empty($groupStr)?'':$groupStr;
    }
    /**
     * 对分组结果通过Having子句进行二次删选
     * @param unknown $having
     * @return string
     */
    public static function parseHaving($having){
        $havingStr='';
        if(is_string($having)&&!empty($having)){
            $havingStr.=' HAVING '.$having;
        }
        return $havingStr;
    }
    /**
     * 解析Order by
     * @param unknown $order
     * @return string
     */
    public static function parseOrder($order){
        $orderStr='';
        if(is_array($order)){
            $orderStr.=' ORDER BY '.join(',',$order);
        }elseif(is_string($order)&&!empty($order)){
            $orderStr.=' ORDER BY '.$order;
        }
        return $orderStr;
    }
    /**
     * 解析限制显示条数limit
     * limit 3
     * limit 0,3
     * @param unknown $limit
     * @return unknown
     */
    public static function parseLimit($limit){
        $limitStr='';
        if(is_array($limit)){
            if(count($limit)>1){
                $limitStr.=' LIMIT '.$limit[0].','.$limit[1];
            }else{
                $limitStr.=' LIMIT '.$limit[0];
            }
        }elseif(is_string($limit)&&!empty($limit)){
            $limitStr.=' LIMIT '.$limit;
        }
        return $limitStr;
    }
    /**
     * 解析字段
     * @param unknown $fields
     * @return string
     */
    public static function parseFields($fields){
        if(is_array($fields)){
            array_walk($fields,array('PdoMySQL','addSpecialChar'));
            $fieldsStr=implode(',',$fields);
        }elseif(is_string($fields)&&!empty($fields)){
            if(strpos($fields,'`')===false){
                $fields=explode(',',$fields);
                array_walk($fields,array('PdoMySQL','addSpecialChar'));
                $fieldsStr=implode(',',$fields);
            }else{
                $fieldsStr=$fields;
            }
        }else{
            $fieldsStr='*';
        }
        return $fieldsStr;
    }
    /**
     * 通过反引号引用字段,
     * @param unknown $value
     * @return string
     */
    public static function addSpecialChar(&$value){
        if($value==='*'||strpos($value,'.')!==false||strpos($value,'`')!==false){
            //不用做处理
        }elseif(strpos($value,'`')===false){
            $value='`'.trim($value).'`';
        }
        return $value;
    }
    /**
     * 执行增删改操作,返回受影响的记录的条数
     * @param string $sql
     * @return boolean|unknown
     */
    public static function execute($sql=null){
        $link=self::$link;
        if(!$link) return false;
        self::$queryStr=$sql;
        if(!empty(self::$PDOStatement))self::free();
        $result=$link->exec(self::$queryStr);
        self::haveErrorThrowException();
        if($result){
            self::$lastInsertId=$link->lastInsertId();
            self::$numRows=$result;
            return self::$numRows;
        }else{
            return false;
        }
    }
    /**
     释放结果集
     */
    public static function free(){
        self::$PDOStatement=null;
    }
    public static function query($sql=''){
        $link=self::$link;
        if(!$link) return false;
        //判断之前是否有结果集,如果有的话,释放结果集
        if(!empty(self::$PDOStatement))self::free();
        self::$queryStr=$sql;
        self::$PDOStatement=$link->prepare(self::$queryStr);
        $res=self::$PDOStatement->execute();
        self::haveErrorThrowException();
        return $res;
    }
    public static function haveErrorThrowException(){
        $obj=empty(self::$PDOStatement)?self::$link: self::$PDOStatement;
        $arrError=$obj->errorInfo();
        //print_r($arrError);
        if($arrError[0]!='00000'){
            self::$error='SQLSTATE: '.$arrError[0].' <br/>SQL Error: '.$arrError[2].'<br/>Error SQL:'.self::$queryStr;
            self::throw_exception(self::$error);
            return false;
        }
        if(self::$queryStr==''){
            self::throw_exception('没有执行SQL语句');
            return false;
        }
    }
    /**
     * 自定义错误处理
     * @param unknown $errMsg
     */
    public static function throw_exception($errMsg){
        echo '<div style="width:80%;background-color:#ABCDEF;color:black;font-size:20px;padding:20px 0px;">
                '.$errMsg.'
        </div>';
    }
    /**
     * 销毁连接对象,关闭数据库
     */
    public static function close(){
        self::$link=null;
    }
    
}
// require_once 'config.php';
// $PdoMySQL=new PdoMySQL;
//var_dump($PdoMySQL);
// $sql='SELECT * FROM user1';
// print_r($PdoMySQL->getAll($sql));
// $sql='SELECT * FROM user WHERE id=36';
// print_r($PdoMySQL->getRow($sql));
// $sql='INSERT user(username,password,email,token,token_exptime,regtime)';
// $sql.="    VALUES('imooc1113','imooc1113','[email protected]','abcdefgh','1392348346','12313346')";
// //echo $sql;
// var_dump($PdoMySQL->execute($sql));
// echo '<hr/>';
// echo $PdoMySQL::$lastInsertId;
// $sql='DELETE FROM user WHERE id>=37';
// var_dump($PdoMySQL->execute($sql));
// $sql='UPDATE user SET username="king1234" WHERE id=36';
// var_dump($PdoMySQL->execute($sql));
// $tabName='user';
// $priId='36';
// //$fields='username,email';
// $fields=array('username','email','regtime');
// $fields='*';
// print_r($PdoMySQL->findById($tabName,$priId,$fields));
//print_r($PdoMySQL->findById($tabName, $priId));
$tables='user';
//print_r($PdoMySQL->find($tables));
//print_r($PdoMySQL->find($tables,'id>=30'));
// print_r($PdoMySQL->find($tables,'id>=30','username,email'));
//print_r($PdoMySQL->find($tables,'id<=10','*','status'));
//print_r($PdoMySQL->find($tables,'id<=10','*','status','count(*)>=6'));
//print_r($PdoMySQL->find($tables,'id>5','*',null,null,'username desc,id desc'));
//print_r($PdoMySQL->find($tables,null,'*',null,null,null,array(3,5)));
// $data= array(
//      'username'=>'imooc',
//      'password'=>'imooc',
//      'email'=>'[email protected]',
//      'token'=>'123abc',
//      'token_exptime'=>'123123',
//      'regtime'=>'123456'
//      );
// var_dump($PdoMySQL->add($data,$tables));
// $data=array(
//      'username'=>'imooc111',
//      'password'=>'imooc222',
//      'email'=>'[email protected]',
//      'token'=>'4444',
//      'token_exptime'=>'1234444',
//      'regtime'=>'12345678'
// );
//var_dump($PdoMySQL->update($data,$tables,'id<=38',' id DESC','2'));

//var_dump($PdoMySQL->delete($tables,'id>35'));
//var_dump($PdoMySQL->delete($tables,'id>3','id DESC','5'));
//print_r($PdoMySQL->showTables());

4、config.php

define("DB_HOST",'localhost');
define("DB_USER",'root');
define('DB_PWD','playboy');
define('DB_NAME','imooc');
define('DB_PORT','3306');
define('DB_TYPE','mysql');
define('DB_CHARSET','utf8');

5.password.php

<?php 
$emailPassword='fantasticbaby';
?>


你可能感兴趣的:(php利用pdo和swiftmailer实现邮箱验证注册)