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 删除cookie和浏览器重定向
Mar 16 PHP
zen cart新进商品的随机排序修改方法
Sep 10 PHP
PHP5权威编程阅读学习笔记 附电子书下载
Jul 05 PHP
php中用memcached实现页面防刷新功能
Aug 19 PHP
PHP框架Laravel的小技巧两则
Feb 10 PHP
php中preg_match的isU代表什么意思
Oct 01 PHP
PHP的Yii框架中Model模型的学习教程
Mar 29 PHP
Yii2 ActiveRecord多表关联及多表关联搜索的实现
Jun 30 PHP
php arsort 数组降序排序详细介绍
Nov 17 PHP
php 从一个数组中随机的取出若干个不同的数实例
Dec 31 PHP
利用ajax和PHP实现简单的流程管理
Mar 23 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
Jun 13 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核心代码分析require和include的区别
2011/01/02 PHP
php密码生成类实例
2014/09/24 PHP
CodeIgniter删除和设置Cookie的方法
2015/04/07 PHP
使用PHP实现生成HTML静态页面
2015/11/18 PHP
php+ajax实现带进度条的上传图片功能【附demo源码下载】
2016/09/14 PHP
ThinkPHP框架下微信支付功能总结踩坑笔记
2019/04/10 PHP
TextArea 控件的最大长度问题(js json)
2009/12/16 Javascript
让AJAX不依赖后端接口实现方案
2012/12/03 Javascript
Nodejs实现多人同时在线移动鼠标的小游戏分享
2014/12/06 NodeJs
nodejs事件的监听与触发的理解分析
2015/02/12 NodeJs
javascript针对不确定函数的执行方法
2015/12/16 Javascript
JS+HTML5 FileReader实现文件上传前本地预览功能
2020/03/27 Javascript
[01:56]林书豪DOTA2上海特级锦标赛励志短片
2016/03/05 DOTA
Python库urllib与urllib2主要区别分析
2014/07/13 Python
简单上手Python中装饰器的使用
2015/07/12 Python
利用ctypes提高Python的执行速度
2016/09/09 Python
python方向键控制上下左右代码
2018/01/20 Python
解决pycharm无法调用pip安装的包问题
2018/05/18 Python
python实现字符串和字典的转换
2018/09/29 Python
Python一行代码实现快速排序的方法
2019/04/30 Python
python在不同条件下的输入与输出
2020/02/13 Python
python字符串判断密码强弱
2020/03/18 Python
Python过滤掉numpy.array中非nan数据实例
2020/06/08 Python
html5 Canvas画图教程(3)—canvas出现1像素线条模糊不清的原因
2013/01/09 HTML / CSS
DC Shoes澳大利亚官方网上商店:购买DC鞋子
2019/10/25 全球购物
JENNIFER BEHR官网:各种耳环和发饰
2020/06/07 全球购物
什么是lambda函数
2013/09/17 面试题
婚礼答谢宴主持词
2014/03/14 职场文书
厉行勤俭节约倡议书
2014/05/16 职场文书
师范大学生求职信
2014/06/13 职场文书
中华在我心中演讲稿
2014/09/13 职场文书
企业整改报告范文
2014/11/08 职场文书
2015年音乐教师个人工作总结
2015/05/20 职场文书
2016年秋季运动会通讯稿
2015/11/25 职场文书
学校2016年圣诞节活动总结
2016/03/31 职场文书
解决Python中的modf()函数取小数部分不准确问题
2021/05/28 Python