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 相关文章推荐
第六节--访问属性和方法
Nov 16 PHP
PHP教程 变量定义
Oct 23 PHP
PHP获取文件绝对路径的代码(上一级目录)
May 29 PHP
PHP学习笔记 IIS7下安装配置php环境
Oct 29 PHP
smarty缓存用法分析
Dec 16 PHP
帝国cms常用标签汇总
Jul 06 PHP
PHP实现二叉树的深度优先与广度优先遍历方法
Sep 28 PHP
PHP使用http_build_query()构造URL字符串的方法
Apr 02 PHP
PHP实现数据分页显示的简单实例
May 26 PHP
PHP会话控制实例分析
Dec 24 PHP
浅谈PHP面向对象之访问者模式+组合模式
May 22 PHP
PHP7.1实现的AES与RSA加密操作示例
Jun 15 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
全国FM电台频率大全 - 22 重庆市
2020/03/11 无线电
ionCube 一款类似zend的PHP加密/解密工具
2010/07/25 PHP
如何突破PHP程序员的技术瓶颈分析
2011/07/17 PHP
深入php-fpm的两种进程管理模式详解
2013/06/03 PHP
中文字符串截取的js函数代码
2013/04/17 Javascript
js字符串转换成xml对象并使用技巧解读
2013/04/18 Javascript
JQuery实现点击div以外的位置隐藏该div窗口
2013/09/13 Javascript
js利用数组length属性清空和截短数组的小例子
2014/01/15 Javascript
jQuery超酷平面式时钟效果代码分享
2020/03/30 Javascript
JQuery.Ajax()的data参数类型实例详解
2015/11/20 Javascript
深入理解Javascript中的自执行匿名函数
2016/06/03 Javascript
JavaScript实现图片瀑布流和底部刷新
2017/01/02 Javascript
jquery版轮播图效果和extend扩展
2017/07/18 jQuery
Javacript中自定义的map.js  的方法
2017/11/26 Javascript
深入理解js 中async 函数的含义和用法
2018/05/13 Javascript
vue中$set的使用(结合在实际应用中遇到的坑)
2018/07/10 Javascript
微信小程序授权登录及解密unionId出错的方法
2018/09/26 Javascript
webpack打包html里面img后src为“[object Module]”问题
2019/12/22 Javascript
vue下axios拦截器token刷新机制的实例代码
2020/01/17 Javascript
如何解决vue在ios微信&quot;复制链接&quot;功能问题
2020/03/26 Javascript
在VUE中使用lodash的debounce和throttle操作
2020/11/09 Javascript
python下读取公私钥做加解密实例详解
2017/03/29 Python
详解Python核心对象类型字符串
2018/02/11 Python
python递归函数绘制分形树的方法
2018/06/22 Python
对python中GUI,Label和Button的实例详解
2019/06/27 Python
python删除指定列或多列单个或多个内容实例
2020/06/28 Python
python安装mysql的依赖包mysql-python操作
2021/01/01 Python
意大利奢侈品网站:Italist
2016/08/23 全球购物
加拿大拼图大师:Puzzle Master
2020/12/28 全球购物
电大物流学生的自我评价
2013/10/25 职场文书
高速铁道技术专业求职信
2014/08/09 职场文书
优秀共产党员推荐材料
2014/12/18 职场文书
优秀团员个人总结
2015/02/26 职场文书
好员工观后感
2015/06/17 职场文书
个人合作协议范本
2015/08/06 职场文书
读鲁迅先生的经典名言
2019/08/20 职场文书