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中的MVC模式运用技巧
May 03 PHP
php下一个阿拉伯数字转中文数字的函数
Jul 16 PHP
shopex中集成的站长统计功能的代码简单分析
Aug 11 PHP
PHP函数microtime()用法与说明
Dec 04 PHP
php使用base64加密解密图片示例分享
Jan 20 PHP
简单说说PHP优化那些事(经验分享)
Nov 27 PHP
THINKPHP内容分页代码分享
Jan 14 PHP
在WordPress中使用wp_count_posts函数来统计文章数量
Jan 05 PHP
php微信公众号开发之二级菜单
Oct 20 PHP
PHP将英文数字转换为阿拉伯数字实例讲解
Jan 28 PHP
解决Laravel使用验证时跳转到首页的问题
Nov 17 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 批量更新网页内容实现代码
2010/01/05 PHP
php发送post请求的三种方法
2014/02/11 PHP
php更新修改excel中的内容实例代码
2014/02/26 PHP
PHP调用Linux命令权限不足问题解决方法
2015/02/07 PHP
PHP加密解密类实例分析
2015/04/20 PHP
php使用SAE原生Mail类实现各种类型邮件发送的方法
2016/10/10 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
2017/11/13 PHP
php传值和传引用的区别点总结
2019/11/19 PHP
PHP sdk实现在线打包代码示例
2020/12/09 PHP
鼠标滚轮改变图片大小的示例代码
2013/11/20 Javascript
js读写json文件实例代码
2014/10/21 Javascript
jQuery中last()方法用法实例
2015/01/06 Javascript
javascript获取本机操作系统类型的方法
2015/08/13 Javascript
jQuery实现鼠标悬停背景翻转的黑色导航菜单代码
2015/09/14 Javascript
AngularJS进行性能调优的7个建议
2015/12/28 Javascript
Js类的静态方法与实例方法区分及jQuery拓展的两种方法
2016/06/03 Javascript
JS获取地址栏参数的两种方法(简单实用)
2016/06/14 Javascript
JS中传递参数的几种不同方法比较
2017/01/20 Javascript
如何用webpack4带你实现一个vue的打包的项目
2018/06/20 Javascript
jQuery ajax仿Google自动提示SearchSuggess功能示例
2019/03/28 jQuery
python中的装饰器详解
2015/04/13 Python
Python 正则表达式入门(中级篇)
2016/12/07 Python
用virtualenv建立多个Python独立虚拟开发环境
2017/07/06 Python
Python实现冒泡排序的简单应用示例
2017/12/11 Python
Django 路由系统URLconf的使用
2018/10/11 Python
Python批处理更改文件名os.rename的方法
2018/10/26 Python
Python中将两个或多个list合成一个list的方法小结
2019/05/12 Python
Python bytes string相互转换过程解析
2020/03/05 Python
比利时香水网上商店:NOTINO
2018/03/28 全球购物
AOP的定义以及作用
2013/09/08 面试题
什么是GWT的Module
2013/01/20 面试题
行政管理人员精品工作推荐信
2013/11/04 职场文书
汽车质检员岗位职责
2015/04/08 职场文书
交通处罚决定书
2015/06/24 职场文书
「偶像大师 MILLION LIVE!」七尾百合子手办开订
2022/03/21 日漫
Java 定时任务技术趋势简介
2022/05/04 Java/Android