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 相关文章推荐
域名和cookie问题(域名后缀)
Oct 10 PHP
利用php实现禁用IE和火狐的缓存问题
Dec 03 PHP
解析thinkphp的左右值无限分类
Jun 20 PHP
提高PHP编程效率的方法
Nov 07 PHP
PHP函数strip_tags的一个bug浅析
May 22 PHP
ThinkPHP自动完成中使用函数与回调方法实例
Nov 29 PHP
php简单实现MVC
Feb 05 PHP
WordPress中制作导航菜单的PHP核心方法讲解
Dec 11 PHP
YII Framework框架教程之国际化实现方法
Mar 14 PHP
PHP单例模式实例分析【防继承,防克隆操作】
May 22 PHP
laravel 框架实现无限级分类的方法示例
Oct 31 PHP
Linux系统下安装PHP7.3版本
Jun 26 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递归调用的小技巧讲解
2013/02/19 PHP
奉献出一个封装的curl函数 便于调用(抓数据专用)
2013/07/22 PHP
php使用PDO下exec()函数查询执行后受影响行数的方法
2017/03/28 PHP
JS Timing
2007/04/21 Javascript
jQuery图片预加载 等比缩放实现代码
2011/10/04 Javascript
html+css+js实现xp window界面及有关功能
2013/03/26 Javascript
JavaScript+CSS控制打印格式示例介绍
2014/01/07 Javascript
js实现数组转换成json
2015/06/26 Javascript
jQuery+CSS3折叠卡片式下拉列表框实现效果
2015/11/02 Javascript
javascript实现延时显示提示框特效代码
2016/04/27 Javascript
picLazyLoad 实现图片延时加载(包含背景图片)
2016/07/21 Javascript
基于angularjs实现图片放大镜效果
2016/08/31 Javascript
简单实现IONIC购物车功能
2017/01/10 Javascript
Vue-cli Eslint在vscode里代码自动格式化的方法
2018/02/23 Javascript
手把手教你如何使用nodejs编写cli命令行
2018/11/05 NodeJs
通过js实现压缩图片上传功能
2020/02/25 Javascript
vue中element 的upload组件发送请求给后端操作
2020/09/07 Javascript
[01:00:17]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第二场 1月25日
2021/03/11 DOTA
在Django中限制已登录用户的访问的方法
2015/07/23 Python
Python中list查询及所需时间计算操作示例
2018/06/21 Python
使用Filter过滤python中的日志输出的实现方法
2019/07/17 Python
Flask使用Pyecharts在单个页面展示多个图表的方法
2019/08/05 Python
Django实现whoosh搜索引擎使用jieba分词
2020/04/08 Python
python 实现图像快速替换某种颜色
2020/06/04 Python
解决pip安装的第三方包在PyCharm无法导入的问题
2020/10/15 Python
html5服务器推送_动力节点Java学院整理
2017/07/12 HTML / CSS
美国网上鞋城:Shoeline.com
2016/11/17 全球购物
Famous Footwear加拿大:美国多品牌运动休闲鞋店
2018/12/05 全球购物
10条PHP编程习惯
2014/05/26 面试题
医院办公室主任职责
2013/12/29 职场文书
教堂婚礼主持词
2014/03/14 职场文书
会计求职简历自我评价
2015/03/10 职场文书
2016新年年会主持词
2015/07/06 职场文书
大学生学习十八届五中全会精神心得体会
2016/01/05 职场文书
上帝为你开了一扇窗之Tkinter常用函数详解
2021/06/02 Python
解决vue自定义组件@click点击失效问题
2022/04/30 Vue.js