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如何透过ODBC来存取数据库
Oct 09 PHP
PHP开启gzip页面压缩实例代码
Mar 11 PHP
字母顺序颠倒而单词顺序不变的php代码
Aug 08 PHP
php中的三元运算符使用说明
Jul 03 PHP
PHPThumb PHP 图片缩略图库
Mar 11 PHP
PHP生成图像验证码的方法小结(2种方法)
Jul 18 PHP
PHP7标量类型declare用法实例分析
Sep 26 PHP
详解使用php调用微信接口上传永久素材
Apr 11 PHP
Yii框架参数配置文件params用法实例分析
Sep 11 PHP
PHP中16个高危函数整理
Sep 19 PHP
Laravel5.5 手动分页和自定义分页样式的简单实现
Oct 15 PHP
PHP7 错误处理机制修改
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
在PHP中利用XML技术构造远程服务(下)
2006/10/09 PHP
解决MySQL中文输出变成问号的问题
2008/06/05 PHP
JpGraph php柱状图使用介绍
2011/08/23 PHP
mac环境中使用brew安装php5.5.15
2014/08/18 PHP
php中使用gd库实现远程图片下载实例
2015/05/12 PHP
js getElementsByTagName的简写方式
2010/06/27 Javascript
jquery动态调整div大小使其宽度始终为浏览器宽度
2014/06/06 Javascript
一个支付页面DEMO附截图
2014/07/22 Javascript
jQuery大于号(&gt;)选择器的作用解释
2015/01/13 Javascript
JS作为值的函数用法示例
2016/06/20 Javascript
解决mpvue + vuex 开发微信小程序vuex辅助函数mapState、mapGetters不可用问题
2018/08/03 Javascript
基于webpack4.X从零搭建React脚手架的方法步骤
2018/12/23 Javascript
js 根据对象数组中的属性进行排序实现代码
2019/09/12 Javascript
[05:53]敌法师的金色冠名ID"BurNIng",是传说,是荣耀
2020/07/11 DOTA
[01:08:29]DOTA2-DPC中国联赛定级赛 RNG vs Aster BO3第一场 1月9日
2021/03/11 DOTA
zbar解码二维码和条形码示例
2014/02/07 Python
Python实现给文件添加内容及得到文件信息的方法
2015/05/28 Python
linux环境下的python安装过程图解(含setuptools)
2017/11/22 Python
Python实现简易Web爬虫详解
2018/01/03 Python
python实现年会抽奖程序
2019/01/22 Python
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
2019/06/04 Python
pandas 使用均值填充缺失值列的小技巧分享
2019/07/04 Python
python实现银行管理系统
2019/10/25 Python
Pytorch使用MNIST数据集实现基础GAN和DCGAN详解
2020/01/10 Python
Python+Dlib+Opencv实现人脸采集并表情判别功能的代码
2020/07/01 Python
HTML5 新标签全部总汇(推荐)
2016/06/13 HTML / CSS
越南母婴用品购物网站:Kids Plaza
2020/04/09 全球购物
php优化查询foreach代码实例讲解
2021/03/24 PHP
竞聘上岗演讲
2014/05/19 职场文书
党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
论群众路线学习心得体会
2014/10/31 职场文书
关于车尾的标语大全
2015/08/11 职场文书
决心书格式范文
2015/09/23 职场文书
2019年消防宣传标语集锦
2019/11/21 职场文书
postman中form-data、x-www-form-urlencoded、raw、binary的区别介绍
2022/01/18 HTML / CSS
golang为什么要统一错误处理
2022/04/03 Golang