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 相关文章推荐
Windows下PHP的任意文件执行漏洞
Oct 09 PHP
sourcesafe管理phpproj文件的补充说明(downmoon)
Apr 11 PHP
黑夜路人出的几道php笔试题
Aug 04 PHP
PHPMyadmin 配置文件详解(配置)
Dec 03 PHP
PHP初学者最感迷茫的问题小结
Mar 27 PHP
PHP MemCached高级缓存配置图文教程
Aug 05 PHP
一张表搞清楚php is_null、empty、isset的区别
Jul 07 PHP
PHP多维数组转一维数组的简单实现方法
Dec 23 PHP
php实现的读取CSV文件函数示例
Feb 07 PHP
php获取文章内容第一张图片的方法示例
Jul 03 PHP
visual studio code 调试php方法(图文详解)
Sep 15 PHP
PHP使用反向Ajax技术实现在线客服系统详解
Jul 01 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
中英文字符串翻转函数
2008/12/09 PHP
php标签云的实现代码
2012/10/10 PHP
yii2 RBAC使用DbManager实现后台权限判断的方法
2016/07/23 PHP
php数值计算num类简单操作示例
2020/05/15 PHP
javascript 操作文件 实现方法小结
2009/07/02 Javascript
js中if语句的几种优化代码写法
2011/03/12 Javascript
js拖拽一些常见的思路方法整理
2014/03/19 Javascript
javascript的日期对象、数组对象、二维数组使用说明
2014/12/22 Javascript
jQuery中even选择器的定义和用法
2014/12/23 Javascript
JavaScript插件化开发教程 (一)
2015/01/27 Javascript
javascript url几种编码方式详解
2016/06/06 Javascript
JS实现兼容各种浏览器的高级拖动方法完整实例【测试可用】
2016/06/21 Javascript
js和jQuery以及easyui实现对下拉框的指定赋值方法
2018/01/23 jQuery
详解redis在nodejs中的应用
2018/05/02 NodeJs
微信小程序性能优化之checkSession的使用
2019/03/06 Javascript
vue项目中在可编辑div光标位置插入内容的实现代码
2020/01/07 Javascript
深入理解Antd-Select组件的用法
2020/02/25 Javascript
浅谈vue-props的default写不写有什么区别
2020/08/09 Javascript
Python 连连看连接算法
2008/11/22 Python
Python实现发送email的几种常用方法
2014/08/18 Python
python中迭代器(iterator)用法实例分析
2015/04/29 Python
Python快速从注释生成文档的方法
2016/12/26 Python
window下eclipse安装python插件教程
2017/04/24 Python
Python实现将HTML转成PDF的方法分析
2019/05/04 Python
Python定时任务随机时间执行的实现方法
2019/08/14 Python
TensorFlow命名空间和TensorBoard图节点实例
2020/01/23 Python
浅谈Keras中shuffle和validation_split的顺序
2020/06/19 Python
python3 通过 pybind11 使用Eigen加速代码的步骤详解
2020/12/07 Python
Python绘制K线图之可视化神器pyecharts的使用
2021/03/02 Python
NYX Professional Makeup俄罗斯官网:世界知名的化妆品品牌
2019/12/26 全球购物
俄罗斯购买内衣网站:Trusiki
2020/08/22 全球购物
高中生毕业自我鉴定
2013/10/10 职场文书
2014向国旗敬礼网上签名活动总结
2014/09/27 职场文书
浅谈:电影《孔子》观后感(范文)
2019/10/14 职场文书
springcloud之Feign超时问题的解决
2021/06/24 Java/Android
解析目标检测之IoU
2021/06/26 Python