php 注册时输入信息验证器的实现详解


Posted in PHP onJuly 05, 2013

1、对输入信息进行验证的类(主要用于验证用户名,密码,重复密码,邮箱,可添加其它功能)

<?php
/**
 * Validator for Register.
 */
final class RegisterValidator {
    private function __construct() {    }
    /**
     * Validate the given username, password, repeat_password and email.
     * @param $username, $password, $repeat_password and $email to be validated
     * @return array array of {@link Error} s
     */
    public static function validate($username, $password, $repeat_password, $email) {
        $errors = array();
        $username = trim($username);
        $password = trim($password);
        if (!$username) {
            $errors[] = new Error('username', '用户名不能为空。');
        } elseif (strlen($username)<3) {
            $errors[] = new Error('username', '用户名长度不能小于3个字符。');
        } elseif (strlen($username)>30) {
            $errors[] = new Error('username', '用户名长度不能超过30个字符。');
        } elseif (!preg_match('/^[A-Za-z]+$/',substr($username, 0, 1))) {
            $errors[] = new Error('username', '用户名必须以字母开头。');
        } elseif (!preg_match('/^[A-Za-z0-9_]+$/', $username)) {
            $errors[] = new Error('username', '用户名只能是字母、数字以及下划线( _ )的组合。');
        } elseif (!$password) {
            $errors[] = new Error('password', '密码不能为空。');
        } elseif (strlen($password)<6) {
            $errors[] = new Error('password', '密码长度不能小于6个字符。');
        } elseif (strlen($password)>30) {
            $errors[] = new Error('password', '密码长度不能超过30个字符。');
        } elseif (!preg_match('/^[A-Za-z0-9!@#\\$%\\^&\\*_]+$/', $password)) {
            $errors[] = new Error('password', '密码只能是数字、字母或!@#$%^&*_等字符的组合。');
        } elseif ($password != trim($repeat_password)) {
            $errors[] = new Error('password', '两次输入密码不一致。');
        } elseif (!Utils::isValidEmail($email)) {
            $errors[] = new Error('email', '邮箱格式有误。');
        } else {
            // check whether user exists or not
            $dao = new UserDao();
            $user = $dao->findByName(trim($username));
            if ($user) {
                $errors[] = new Error('username', '该用户名已经被使用。');
            }
            $user = null;
            // check whether email being used or not
            $user = $dao->findByEmail(trim($email));
            if ($user) {
                $errors[] = new Error('email', '该邮箱已被注册。');
            }
        }
        return $errors;
    }
}
?>

2、在注册页面进行调用
$username = null;
$password = null;
$repeat_password = null;
$email = null;
$msg = "";
if (isset($_POST['username']) && isset($_POST['password'])
        && isset($_POST['repeat_password']) && isset($_POST['email'])) {
    $username = addslashes(trim(stripslashes($_POST ['username'])));
    $password = addslashes(trim(stripslashes($_POST ['password'])));
    $repeat_password = addslashes(trim(stripslashes($_POST ['repeat_password'])));
    $email = addslashes(trim(stripslashes($_POST ['email'])));
    // validate
    $errors = RegisterValidator::validate($username, $password, $repeat_password, $email);
    // validate
    if (empty($errors)) {
        // save
        $dao = new UserDao();
        $user = new User();
        $user->setEmail($email);
        $last_login_ip = Utils::getIpAddress();
        $user->setLastLoginIp($last_login_ip);
        $user->setUsername($username);
        $salt = substr(sha1(mt_rand()), 0, 22);
        $hash_password = sha1($salt . $password);
        $user->setPassword($hash_password);
        $user->setSalt($salt);
        $user = $dao->save($user);
        if ($user) {
            UserLogin::setUserInfo($user);
            Flash::addFlash('注册成功!');
        }
        else {
            Flash::addFlash('对不起,由于服务器内部错误,导致注册失败。请稍后再试。');
        }
        Utils::redirect('welcome');
    }    foreach ($errors as $e) {
        $msg .= $e->getMessage()."<br>";
    }

3.代码中Error类用于记录验证时的错误信息
<?php
/**
 * Validation error.
 */
final class Error {
    private $source;
    private $message;
    /**
     * Create new error.
     * @param mixed $source source of the error
     * @param string $message error message
     */
    function __construct($source, $message) {
        $this->source = $source;
        $this->message = $message;
    }
    /**
     * Get source of the error.
     * @return mixed source of the error
     */
    public function getSource() {
        return $this->source;
    }
    /**
     * Get error message.
     * @return string error message
     */
    public function getMessage() {
        return $this->message;
    }
}
?>
PHP 相关文章推荐
PHP配置文件中最常用四个ini函数
Mar 19 PHP
PHP初学者最感迷茫的问题小结
Mar 27 PHP
php 常用算法和时间复杂度
Jul 01 PHP
使用php实现截取指定长度
Aug 06 PHP
PHPMailer的主要功能特点和简单使用说明
Feb 17 PHP
在Yii框架中使用PHP模板引擎Twig的例子
Jun 13 PHP
PHP大批量插入数据库的3种方法和速度对比
Jul 08 PHP
ThinkPHP模板循环输出Volist标签用法实例详解
Mar 23 PHP
php使用include 和require引入文件的区别
Feb 16 PHP
php session_decode函数用法讲解
May 26 PHP
详解Laravel服务容器的绑定与解析
Nov 05 PHP
PHP实用小技巧之调用录像的方法
Dec 05 PHP
php解析html类库simple_html_dom(详细介绍)
Jul 05 #PHP
Apache实现Web Server负载均衡详解(不考虑Session版)
Jul 05 #PHP
如何在Ubuntu下启动Apache的Rewrite功能
Jul 05 #PHP
如何解决CI框架的Disallowed Key Characters错误提示
Jul 05 #PHP
浅析十款PHP开发框架的对比
Jul 05 #PHP
利用PHP实现短域名互转
Jul 05 #PHP
PHP 安全检测代码片段(分享)
Jul 05 #PHP
You might like
php实现在限定区域里自动调整字体大小的类实例
2015/04/02 PHP
php中session定期自动清理的方法
2015/11/12 PHP
php微信公众号开发(4)php实现自定义关键字回复
2016/12/15 PHP
使用PHPUnit进行单元测试并生成代码覆盖率报告的方法
2019/03/08 PHP
JavaScript中获取元素索引的函数
2010/09/10 Javascript
javascript实现淡蓝色的鼠标拖动选择框实例
2015/05/09 Javascript
JQuery中模拟image的ajaxPrefilter与ajaxTransport处理
2015/06/19 Javascript
javascript中传统事件与现代事件
2015/06/23 Javascript
适用于手机端的jQuery图片滑块动画
2016/12/09 Javascript
JavaScript判断浏览器及其版本信息
2017/01/20 Javascript
Javascript循环删除数组中元素的几种方法示例
2017/05/18 Javascript
Express+Nodejs 下的登录拦截实现代码
2017/07/01 NodeJs
js实现图片轮播效果学习笔记
2017/07/26 Javascript
讲解vue-router之什么是编程式路由
2018/05/28 Javascript
详解微信小程序回到顶部的两种方式
2019/05/09 Javascript
js图片查看器插件用法示例
2019/06/22 Javascript
javascript触发模拟鼠标点击事件
2019/06/26 Javascript
Vue使用NProgress进度条的方法
2019/09/21 Javascript
JavaScript的变量声明与声明提前用法实例分析
2019/11/26 Javascript
vue 通过绑定事件获取当前行的id操作
2020/07/27 Javascript
Vue基本指令实例图文讲解
2021/02/25 Vue.js
python 测试实现方法
2008/12/24 Python
python中assert用法实例分析
2015/04/30 Python
python模块之re正则表达式详解
2017/02/03 Python
python模块之sys模块和序列化模块(实例讲解)
2017/09/13 Python
如何学习Python time模块
2020/06/03 Python
详解Python中的Lock和Rlock
2021/01/26 Python
python pyg2plot的原理知识点总结
2021/02/28 Python
华为C++笔试题
2014/08/05 面试题
程序员求职信
2014/04/16 职场文书
一体化教学实施方案
2014/05/10 职场文书
民主生活会整改措施(党员)
2014/09/18 职场文书
公司2014年度工作总结
2014/12/10 职场文书
法定代表人免职证明
2015/06/24 职场文书
elasticSearch-api的具体操作步骤讲解
2021/06/28 Java/Android
mongodb数据库迁移变更的解决方案
2021/09/04 MongoDB