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 url地址栏传中文乱码解决方法集合
Jun 25 PHP
深入PHP操作MongoDB的技术总结
Jun 02 PHP
实用的简单PHP分页集合包括使用方法
Oct 21 PHP
php解析xml提示Invalid byte 1 of 1-byte UTF-8 sequence错误的处理方法
Nov 14 PHP
php设置session值和cookies的学习示例
Mar 21 PHP
php实现的ping端口函数实例
Nov 12 PHP
利用php输出不同的心形图案
Apr 22 PHP
yii框架redis结合php实现秒杀效果(实例代码)
Oct 26 PHP
Phpstorm+Xdebug断点调试PHP的方法
May 14 PHP
PHP session垃圾回收机制实例分析
Jun 28 PHP
Thinkphp5框架中引入Markdown编辑器操作示例
Jun 03 PHP
PHP常量及变量区别原理详解
Aug 14 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 Stream_*系列函数
2010/08/01 PHP
Yii框架关联查询with用法分析
2014/12/02 PHP
浅析Yii2集成富文本编辑器redactor实例教程
2016/04/25 PHP
php页面跳转session cookie丢失导致不能登录等问题的解决方法
2016/12/12 PHP
Yii框架实现的验证码、登录及退出功能示例
2017/05/20 PHP
javascript中的parseInt和parseFloat区别
2013/07/12 Javascript
JS两种定义方式的区别、内部原理
2013/11/21 Javascript
jQuery实现的淡入淡出与滑入滑出效果示例
2018/04/18 jQuery
微信小程序基于picker实现级联菜单
2019/02/15 Javascript
vue中的v-if和v-show的区别详解
2019/09/01 Javascript
vuex + keep-alive实现tab标签页面缓存功能
2019/10/17 Javascript
[01:28:56]2014 DOTA2华西杯精英邀请赛 5 24 CIS VS DK
2014/05/26 DOTA
[45:50]完美世界DOTA2联赛PWL S3 CPG vs Forest 第二场 12.16
2020/12/17 DOTA
python 实现判断ip连通性的方法总结
2018/04/22 Python
python使用matplotlib模块绘制多条折线图、散点图
2020/04/26 Python
python 将json数据提取转化为txt的方法
2018/10/26 Python
python定时检测无响应进程并重启的实例代码
2019/04/22 Python
python3发送邮件需要经过代理服务器的示例代码
2019/07/25 Python
Python利用Faiss库实现ANN近邻搜索的方法详解
2020/08/03 Python
python+selenium实现12306模拟登录的步骤
2021/01/21 Python
详解H5 活动页之移动端 REM 布局适配方法
2017/12/07 HTML / CSS
试解释COMMIT操作和ROLLBACK操作的语义
2014/07/25 面试题
电钳专业个人求职信
2014/01/04 职场文书
医院辞职信范文
2014/01/17 职场文书
优秀老师事迹材料
2014/02/05 职场文书
大龄毕业生求职别忘职业规划
2014/03/11 职场文书
学用政策心得体会
2014/09/10 职场文书
2014教师个人自我评价范文
2014/09/13 职场文书
2014乡党委副书记党建工作汇报材料
2014/11/02 职场文书
初中作文评语
2014/12/25 职场文书
投标承诺函格式
2015/01/21 职场文书
汽车4S店销售经理岗位职责
2015/04/02 职场文书
2015年中学校长工作总结
2015/05/19 职场文书
小学总务工作总结
2015/08/13 职场文书
golang interface判断为空nil的实现代码
2021/04/24 Golang
Go微服务项目配置文件的定义和读取示例详解
2022/06/21 Golang