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实现小型站点广告管理(修正版)
Oct 09 PHP
微博短链接算法php版本实现代码
Sep 15 PHP
解析php根据ip查询所在地区(非常有用,赶集网就用到)
Jul 01 PHP
详解PHP中strlen和mb_strlen函数的区别
Mar 07 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(九)
Jun 24 PHP
php模拟post提交数据的方法
Feb 12 PHP
Linux系统递归生成目录中文件的md5的方法
Jun 29 PHP
php实现网页缓存的工具类分享
Jul 14 PHP
浅谈PHP中的面向对象OOP中的魔术方法
Jun 12 PHP
PHP从零开始打造自己的MVC框架之类的自动加载实现方法详解
Jun 03 PHP
php ActiveMQ的安装与使用方法图文教程
Feb 23 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 flush 函数使用注意事项
2016/08/26 PHP
js 实现打印网页中定义的部分内容的代码
2010/04/01 Javascript
js function定义函数使用心得
2010/04/15 Javascript
js加入收藏以及使用Jquery更改透明度
2014/01/26 Javascript
使用jQuery和PHP实现类似360功能开关效果
2014/02/12 Javascript
jQuery Masonry瀑布流插件使用详解
2014/11/17 Javascript
jQuery实现个性翻牌效果导航菜单的方法
2015/03/09 Javascript
Jquery中的$.each获取各种返回类型数据的使用方法
2015/05/03 Javascript
浅谈javascript中new操作符的原理
2016/06/07 Javascript
基于angularjs实现图片放大镜效果
2016/08/31 Javascript
Vue 实时监听窗口变化 windowresize的两种方法
2018/11/06 Javascript
手动下载Chrome并解决puppeteer无法使用问题
2018/11/12 Javascript
JS使用Dijkstra算法求解最短路径
2019/01/17 Javascript
[00:28]DOTA2北京网鱼队选拔赛
2015/04/08 DOTA
[02:12]2015国际邀请赛 SHOWOPEN
2015/08/05 DOTA
[40:16]TFT vs Mski Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
Python ZipFile模块详解
2013/11/01 Python
使用Python下载Bing图片(代码)
2013/11/07 Python
Python中针对函数处理的特殊方法
2014/03/06 Python
通过mod_python配置运行在Apache上的Django框架
2015/07/22 Python
Python聚类算法之DBSACN实例分析
2015/11/20 Python
python安装numpy&amp;安装matplotlib&amp; scipy的教程
2017/11/02 Python
python logging重复记录日志问题的解决方法
2018/07/12 Python
python tkinter图形界面代码统计工具(更新)
2019/09/18 Python
Python爬虫爬取煎蛋网图片代码实例
2019/12/16 Python
python中的线程threading.Thread()使用详解
2019/12/17 Python
python 实现保存最新的三份文件,其余的都删掉
2019/12/22 Python
python 项目目录结构设置
2020/02/14 Python
PyTorch中Tensor的数据统计示例
2020/02/17 Python
opencv 实现特定颜色线条提取与定位操作
2020/06/02 Python
解决TensorFlow程序无限制占用GPU的方法
2020/06/30 Python
美国高级工作服品牌:Carhartt
2018/01/25 全球购物
怎样声明接口
2014/09/19 面试题
陈欧的广告词
2014/03/18 职场文书
污染环境建议书
2015/09/14 职场文书
JS中一些高效的魔法运算符总结
2021/05/06 Javascript