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 时间计算问题小结
Jan 04 PHP
php 使用post,get的一种简洁方式
Apr 25 PHP
php 删除一个数组中的某个值.兼容多维数组!
Feb 18 PHP
php获取域名的google收录示例
Mar 24 PHP
codeigniter数据库操作函数汇总
Jun 12 PHP
php中get_meta_tags()、CURL与user-agent用法分析
Dec 16 PHP
PHP中COOKIES使用示例
Jul 26 PHP
PHP实现仿Google分页效果的分页函数
Jul 29 PHP
php获取文件后缀的9种方法
Mar 22 PHP
PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)
Nov 15 PHP
老生常谈PHP数组函数array_merge(必看篇)
May 25 PHP
thinkphp5+layui实现的分页样式示例
Oct 08 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中的UNICODE 编码与解码
2013/06/29 PHP
解析php做推送服务端实现ios消息推送
2013/07/01 PHP
php策略模式简单示例分析【区别于工厂模式】
2019/09/25 PHP
PHP扩展安装方法步骤解析
2020/11/24 PHP
laravel与thinkphp之间的区别与优缺点
2021/03/02 PHP
28个JS验证函数收集
2010/03/02 Javascript
ECMAScript 创建自己的js类库
2012/11/22 Javascript
一看就懂:jsonp详解
2015/06/01 Javascript
jQuery插件echarts设置折线图中折线线条颜色和折线点颜色的方法
2017/03/03 Javascript
JS实现图片上传多次上传同一张不生效的处理方法
2018/08/06 Javascript
使用pm2部署node生产环境的方法步骤
2019/03/09 Javascript
JavaScript实现无限级递归树的示例代码
2019/03/29 Javascript
vue router 组件的高级应用实例代码
2019/04/08 Javascript
vue实现在线预览pdf文件和下载(pdf.js)
2019/11/26 Javascript
Object.keys() 和 Object.getOwnPropertyNames() 的区别详解
2020/05/21 Javascript
Python函数式编程指南(四):生成器详解
2015/06/24 Python
详解Python中映射类型的内建函数和工厂函数
2015/08/19 Python
Python正则捕获操作示例
2017/08/19 Python
详解Selenium+PhantomJS+python简单实现爬虫的功能
2019/07/14 Python
Matplotlib绘制雷达图和三维图的示例代码
2020/01/07 Python
双向RNN:bidirectional_dynamic_rnn()函数的使用详解
2020/01/20 Python
python3处理word文档实例分析
2020/12/01 Python
惠普加拿大在线商店:HP加拿大
2017/09/15 全球购物
苏格兰在线威士忌商店:The Whisky Barrel
2019/05/07 全球购物
保险专业大专生求职信
2013/10/26 职场文书
园林设计师自荐信
2013/11/18 职场文书
《再别康桥》教学反思
2014/02/12 职场文书
创建卫生先进单位实施方案
2014/03/10 职场文书
《去年的树》教学反思
2014/04/11 职场文书
教师演讲稿大全
2014/05/16 职场文书
2014年村支部书记四风对照检查材料思想汇报
2014/10/02 职场文书
2014年政协委员工作总结
2014/12/01 职场文书
西岭雪山导游词
2015/02/06 职场文书
大学生简历自我评价2015
2015/03/03 职场文书
python 对图片进行简单的处理
2021/06/23 Python
速龙x4-860k处理器相当于i几
2022/04/20 数码科技