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的ASP防火墙
Oct 09 PHP
MySQL授权问题总结
May 06 PHP
PHP 输出简单动态WAP页面
Jun 09 PHP
php中可能用来加密字符串的函数[base64_encode、urlencode、sha1]
Jan 16 PHP
用PHP读取超大文件的实例代码
Apr 01 PHP
php在window iis的莫名问题的测试方法
May 14 PHP
php设计模式之简单工厂模式详解
Sep 04 PHP
smarty模板引擎从配置文件中获取数据的方法
Jan 22 PHP
详谈PHP编码转换问题
Jul 28 PHP
php简单判断文本编码的方法
Jul 30 PHP
使用vs code编辑调试php配置的方法
Jan 29 PHP
ThinkPHP5.1的权限控制怎么写?分享一个AUTH权限控制
Mar 09 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
详细介绍:Apache+PHP+MySQL配置攻略
2006/09/05 PHP
坏狼php学习 计数器实例代码
2008/06/15 PHP
PHP支付系统设计与典型案例分享
2016/08/02 PHP
优化网页之快速的呈现我们的网页
2007/06/29 Javascript
11个用于提高排版水平的基于jquery的文字效果插件
2012/09/14 Javascript
浅谈jQuery异步对象(XMLHttpRequest)
2014/11/17 Javascript
原生js实现tab选项卡切换
2020/03/23 Javascript
Bootstrap入门教程一Hello Bootstrap初识
2017/03/02 Javascript
基于Two.js实现星球环绕动画效果的示例
2017/11/06 Javascript
JS实现获取毫秒值及转换成年月日时分秒的方法
2018/08/15 Javascript
Vue数字输入框组件示例代码详解
2020/01/15 Javascript
Vue父子传递实例讲解
2020/02/14 Javascript
[48:44]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS HGT
2014/05/22 DOTA
python中执行shell的两种方法总结
2017/01/10 Python
详解python中的 is 操作符
2017/12/26 Python
将python代码和注释分离的方法
2018/04/21 Python
用Python实现将一张图片分成9宫格的示例
2019/07/05 Python
Python原始套接字编程实例解析
2020/01/29 Python
使用Python求解带约束的最优化问题详解
2020/02/11 Python
开启Django博客的RSS功能的实现方法
2020/02/17 Python
解决jupyter notebook打不开无反应 浏览器未启动的问题
2020/04/10 Python
Python logging模块handlers用法详解
2020/08/14 Python
美国眼镜网站:EyeBuyDirect
2017/04/13 全球购物
Footshop罗马尼亚:最好的运动鞋选择
2019/09/10 全球购物
简单的JAVA编程面试题
2013/03/19 面试题
工作中的自我评价如何写好
2013/10/28 职场文书
市政施工员自我鉴定
2014/01/15 职场文书
珠宝店促销方案
2014/03/21 职场文书
财务管理专业求职信
2014/06/11 职场文书
党支部2014年度工作总结
2014/12/04 职场文书
西安大雁塔导游词
2015/02/10 职场文书
教学督导岗位职责
2015/04/10 职场文书
python 命令行传参方法总结
2021/05/25 Python
python 常用的异步框架汇总整理
2021/06/18 Python
微软官方消息,在 2023 年 4 月 11 日之后微软将不再为 Office 2013 和 Skype for Business 2015 提供安全更新
2022/04/21 数码科技
JS前端使用canvas实现扩展物体类和事件派发
2022/08/05 Javascript