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 上传功能实例代码
Apr 13 PHP
关于php程序报date()警告的处理(date_default_timezone_set)
Oct 22 PHP
php按百分比生成缩略图的代码分享
May 10 PHP
php随机抽奖实例分析
Mar 04 PHP
php递归实现无限分类的方法
Jul 28 PHP
举例详解PHP脚本的测试方法
Aug 05 PHP
php获取文件后缀的9种方法
Mar 22 PHP
Yii2-GridView 中让关联字段带搜索和排序功能示例
Jan 21 PHP
PHP分享图片的生成方法
Apr 25 PHP
在 Laravel 项目中使用 webpack-encore的方法
Jul 21 PHP
Laravel5.5+ 使用API Resources快速输出自定义JSON方法详解
Apr 06 PHP
PHP大文件分割分片上传实现代码
Dec 09 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
phpfans留言版用到的数据操作类和分页类
2007/01/04 PHP
Apache2中实现多网站域名绑定的实现方法
2011/06/01 PHP
PHP保存session到memcache服务器的方法
2016/01/19 PHP
php基于Fleaphp框架实现cvs数据导入MySQL的方法
2016/02/23 PHP
PHP创建word文档的方法(平台无关)
2016/03/29 PHP
PHP定义字符串的四种方式详解
2018/02/06 PHP
js 利用className得到对象的实现代码
2011/11/15 Javascript
FusionCharts图表显示双Y轴双(多)曲线
2012/11/22 Javascript
Ajax提交与传统表单提交的区别说明
2014/02/07 Javascript
基于NodeJS的前后端分离的思考与实践(四)安全问题解决方案
2014/09/26 NodeJs
整理Javascript事件响应学习笔记
2015/12/02 Javascript
JS DOM实现鼠标滑动图片效果
2020/09/17 Javascript
jQuery验证插件validate使用详解
2016/05/11 Javascript
JavaScript中的this引用(推荐)
2016/08/05 Javascript
BootStrap Table 分页后重新搜索问题的解决办法
2016/08/08 Javascript
jquery实时获取时间的简单实例
2017/01/26 Javascript
javascript事件的绑定基础实例讲解(34)
2017/02/14 Javascript
vue登录路由验证的实现
2017/12/13 Javascript
vue打包使用Nginx代理解决跨域问题
2018/08/27 Javascript
vue使用Font Awesome的方法步骤
2019/02/26 Javascript
python网络编程学习笔记(四):域名系统
2014/06/09 Python
初步解析Python下的多进程编程
2015/04/28 Python
Python自定义类的数组排序实现代码
2016/08/28 Python
python模拟菜刀反弹shell绕过限制【推荐】
2019/06/25 Python
python中wx模块的具体使用方法
2020/05/15 Python
如何使用localstorage代替cookie实现跨域共享数据问题
2018/04/18 HTML / CSS
美国最佳选择产品网站:Best Choice Products
2019/05/27 全球购物
县委常委班子对照检查材料思想汇报
2014/09/28 职场文书
校本课程教学计划
2015/01/19 职场文书
2015年学校党建工作总结
2015/05/19 职场文书
力克胡哲观后感
2015/06/10 职场文书
2019开业庆典剪彩仪式主持词!
2019/07/22 职场文书
详解MySQL 用户权限管理
2021/04/20 MySQL
python学习之panda数据分析核心支持库
2021/05/07 Python
java设计模式--建造者模式详解
2021/07/21 Java/Android
Python之Matplotlib绘制热力图和面积图
2022/04/13 Python