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数据库操作面向对象的优点
Oct 09 PHP
VFP与其他应用程序的集成
Oct 09 PHP
追求程序速度,而不是编程的速度
Apr 23 PHP
解析PHP跨站刷票的实现代码
Jun 18 PHP
PH P5.2至5.5、5.6的新增功能详解
Jul 14 PHP
PHP中使用strpos函数实现屏蔽敏感关键字功能
Aug 21 PHP
php查询mysql大量数据造成内存不足的解决方法
Mar 04 PHP
PHP远程调试之XDEBUG
Dec 29 PHP
CI框架中数据库操作函数$this-&gt;db-&gt;where()相关用法总结
May 17 PHP
Zend Framework实现自定义过滤器的方法
Dec 09 PHP
php处理多图上传压缩代码功能
Jun 13 PHP
php实现快速对二维数组某一列进行组装的方法小结
Dec 04 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
Syphon 使用方法
2021/03/03 冲泡冲煮
php中几种常见安全设置详解
2010/04/06 PHP
PHPnow安装服务[apache_pn]失败的问题的解决方法
2010/09/10 PHP
PHP防止post重复提交数据的简单例子
2014/06/07 PHP
javascript IE中的DOM ready应用技巧
2008/07/23 Javascript
Jquery跨域获得Json时invalid label错误的解决办法
2011/01/11 Javascript
原生javascript兼容性测试实例
2013/07/01 Javascript
javascript用函数实现对象的方法
2015/05/14 Javascript
javascript实现相同事件名称,不同命名空间的调用方法
2015/06/26 Javascript
整理Javascript基础入门学习笔记
2015/11/29 Javascript
JavaScript程序开发之JS代码放置的位置
2016/01/15 Javascript
js实现文字截断功能
2016/09/14 Javascript
js实现颜色阶梯渐变效果(Gradient算法)
2017/03/21 Javascript
javascript观察者模式实现自动刷新效果
2017/09/05 Javascript
详解处理Vue单页面应用SEO的另一种思路
2018/11/09 Javascript
使用layui前端框架弹出form表单以及提交的示例
2019/10/25 Javascript
[01:09:40]Newbee vs Pain 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
在Python中使用zlib模块进行数据压缩的教程
2015/06/26 Python
python3利用venv配置虚拟环境及过程中的小问题小结
2018/08/01 Python
利用python、tensorflow、opencv、pyqt5实现人脸实时签到系统
2019/09/25 Python
Python imread、newaxis用法详解
2019/11/04 Python
Python Merge函数原理及用法解析
2020/09/16 Python
Python 利用Entrez库筛选下载PubMed文献摘要的示例
2020/11/24 Python
MANGO官方网站:西班牙芒果服装品牌
2017/01/15 全球购物
美国在线面料商店:Fashion Fabrics Club
2020/01/31 全球购物
说出你对remoting 和webservice的理解和应用
2014/06/08 面试题
公积金转移接收函
2014/01/11 职场文书
旷课检讨书范文
2015/01/27 职场文书
黄石寨导游词
2015/02/05 职场文书
综合实践活动报告
2015/02/05 职场文书
格列夫游记读书笔记
2015/07/01 职场文书
2016大学生暑期三下乡心得体会
2016/01/23 职场文书
《有余数的除法》教学反思
2016/02/22 职场文书
创业不要错过,这4种餐饮新模式
2019/07/18 职场文书
WordPress多语言翻译插件 - WPML使用教程
2021/04/01 PHP
MySQL插入数据与查询数据
2022/03/25 MySQL