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 相关文章推荐
简单的页面缓冲技术
Oct 09 PHP
PHP提取中文首字母
Apr 09 PHP
PHP错误和异长常处理总结
Mar 06 PHP
用PHP代替JS玩转DOM的思路及示例代码
Jun 15 PHP
详解PHP执行定时任务的实现思路
Dec 21 PHP
学习PHP Cookie处理函数
Aug 09 PHP
PHP mysqli事务操作常用方法分析
Jul 22 PHP
PHP安装BCMath扩展的方法
Feb 13 PHP
使用Laravel中的查询构造器实现增删改查功能
Sep 03 PHP
php服务器的系统详解
Oct 12 PHP
laravel 自定义常量的两种方案
Oct 14 PHP
Laravel 微信小程序后端搭建步骤详解
Nov 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 fputcsv命令 写csv文件遇到的小问题(多维数组连接符)
2011/05/24 PHP
php从数组中随机抽取一些元素的代码
2012/11/05 PHP
简单的php数据库操作类代码(增,删,改,查)
2013/04/08 PHP
php提示Warning:mysql_fetch_array() expects的解决方法
2014/12/16 PHP
PHP获取指定月份第一天和最后一天的方法
2015/07/18 PHP
用JS将搜索的关键字高亮显示实现代码
2013/11/08 Javascript
node.js中实现同步操作的3种实现方法
2014/12/05 Javascript
javascript中cookie对象用法实例分析
2015/01/30 Javascript
javascript中eval和with用法实例总结
2015/11/30 Javascript
jquery简单插件制作(fn.extend)完整实例
2016/05/24 Javascript
AngularJS通过$sce输出html的方法
2016/09/22 Javascript
详解vue数据渲染出现闪烁问题
2017/06/29 Javascript
详解Vue微信公众号开发踩坑全记录
2017/08/21 Javascript
javascript+html5+css3自定义弹出窗口效果
2017/10/26 Javascript
jQuery实现定时隐藏对话框的方法分析
2018/02/12 jQuery
微信小程序实现卡片左右滑动效果的示例代码
2019/05/01 Javascript
微信小程序云开发实现数据添加、查询和分页
2019/05/17 Javascript
Python中enumerate函数代码解析
2017/10/31 Python
Python使用sort和class实现的多级排序功能示例
2018/08/15 Python
python使用adbapi实现MySQL数据库的异步存储
2019/03/19 Python
Django REST framework 分页的实现代码
2019/06/19 Python
通过cmd进入python的实例操作
2019/06/26 Python
Python解压 rar、zip、tar文件的方法
2019/11/19 Python
Python StringIO如何在内存中读写str
2020/01/07 Python
python实现超级马里奥
2020/03/18 Python
浅析python 动态库m.so.1.0错误问题
2020/05/09 Python
详解Selenium 元素定位和WebDriver常用方法
2020/12/04 Python
特步官方商城:Xtep
2017/03/21 全球购物
台湾深度自由行旅游平台:Tripbaa趣吧
2017/10/10 全球购物
PHP如何防止SQL注入
2014/05/03 面试题
房地产广告词大全
2014/03/19 职场文书
大学竞选班长演讲稿
2014/04/24 职场文书
个人借款协议书范本
2014/11/17 职场文书
gateway网关接口请求的校验方式
2021/07/15 Java/Android
redis protocol通信协议及使用详解
2022/07/15 Redis
Golang Web 框架Iris安装部署
2022/08/14 Python