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文件向另一个地址post数据,不用表单和隐藏的变量的
Mar 06 PHP
php HandlerSocket的使用
May 02 PHP
php报表之jpgraph柱状图实例代码
Aug 22 PHP
PHP Parse Error: syntax error, unexpected $end 错误的解决办法
Jun 05 PHP
php中将一个对象保存到Session中的方法
Mar 13 PHP
PHP判断数组是否为空的常用方法(五种方法)
Feb 08 PHP
php封装单文件上传到数据库(路径)
Oct 15 PHP
实例分析PHP中PHPMailer发邮件
Dec 13 PHP
Laravel框架文件上传功能实现方法示例
Apr 16 PHP
PHP上传图片到数据库并显示的实例代码
Dec 20 PHP
PHP 加密 Password Hashing API基础知识点
Mar 02 PHP
laravel7学习之无限级分类的最新实现方法
Sep 30 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判断变量的函数
2012/04/24 PHP
PHP合并discuz用户脚本的方法
2015/08/04 PHP
Codeigniter控制器controller继承问题实例分析
2016/01/19 PHP
php实现XML和数组的相互转化功能示例
2017/02/08 PHP
详解php命令注入攻击
2019/04/06 PHP
JScript的条件编译
2007/05/29 Javascript
Jquery在IE7下无法使用 $.ajax解决方法
2009/11/11 Javascript
php is_numberic函数造成的SQL注入漏洞
2014/03/10 Javascript
使用Javascript实现选择下拉菜单互移并排序
2016/02/23 Javascript
JQuery EasyUI Layout 在from布局自适应窗口大小的实现方法
2016/05/28 Javascript
js实现楼层效果的简单实例
2016/07/15 Javascript
JavaScipt选取文档元素的方法(推荐)
2016/08/05 Javascript
javascript数组常用方法汇总
2016/09/10 Javascript
JS正则表达式之非捕获分组用法实例分析
2016/12/28 Javascript
vue更改数组中的值实例代码详解
2020/02/07 Javascript
Nuxt默认模板、默认布局和自定义错误页面的实现
2020/05/11 Javascript
vue keep-alive的简单总结
2021/01/25 Vue.js
Python编程之多态用法实例详解
2015/05/19 Python
Python中getattr函数和hasattr函数作用详解
2016/06/14 Python
解决Python的str强转int时遇到的问题
2018/04/09 Python
python实现求特征选择的信息增益
2018/12/18 Python
python根据txt文本批量创建文件夹
2020/12/08 Python
python实现感知机线性分类模型示例代码
2019/06/02 Python
利用Python的folium包绘制城市道路图的实现示例
2020/08/24 Python
辅导员评语
2014/05/04 职场文书
2014年车间工作总结
2014/11/21 职场文书
一个独生女的故事观后感
2015/06/04 职场文书
2015年“我们的节日·重阳节”活动总结
2015/07/29 职场文书
会计专业2019暑假实习报告
2019/06/21 职场文书
读鲁迅先生的经典名言
2019/08/20 职场文书
创业计划书之养殖业
2019/10/11 职场文书
Python快速优雅的批量修改Word文档样式
2021/05/20 Python
Java使用httpRequest+Jsoup爬取红蓝球号码
2021/07/02 Java/Android
Redis 哨兵机制及配置实现
2022/03/25 Redis
全新239军机修复记
2022/04/05 无线电
Spring boot admin 服务监控利器详解
2022/08/05 Java/Android