php注册的时候怎么验证用户名是不是存在

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php注册的时候怎么验证用户名是不是存在相关的知识,希望对你有一定的参考价值。

1    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "
002     
003     <head>    
004     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />    
005     <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />    
006     <link rel="stylesheet" type="text/css" href="css/int.css" />    
007     <script type="text/javascript" src="js/func.js"></script>    
008     <style type="text/css">    
009     td    
010         height:30px;    
011         vertical-align:middle;    
012         align:center;    
013         
014     #myText    
015      width:600px;    
016         
017     </style>    
018     <title>注册页面http://yige.org</title>    
019     </head>    
020          
021     <body >    
022          
023     <?php    
024     error_reporting(0);    
025     //不让PHP报告有错语发生。如果不关闭好有类似这的错语 Warning: preg_match() 关闭就不出现了    
026     session_start();    
027     header("Cache-control: private");    
028          
029     $conn = @ mysql_connect("localhost","root","")or die("数据库连接错误");    
030     mysql_select_db("bbs",$conn);    
031     mysql_query("set names utf8");    
032          
033     if($_POST[\'submit\'])    
034           
035         $username = $_POST["username"];    
036              
037         $sql="select userName  from user_info where userName=\'$username\'";    
038      //   echo $sql;    
039              
040         $query=mysql_query($sql);    
041         $rows = mysql_num_rows($query);    
042         if($rows > 0)    
043              echo "<script type=\'text/javascript\'>alert(\'用户名已存在\');location=\'javascript:history.back()\';</script>";    
044         else    
045             $user_in = "insert into user_info (username,pass,sex,qq,email,img) values (\'$_POST[username]\',md5(\'$_POST[pass]\'),\'$_POST[sex]\',\'$_POST[qq]\',\'$_POST[email]\',\'$_POST[img_select]\')";           
046             //echo $user_in;    
047             mysql_query($user_in);    
048             echo "<script type=\'text/javascript\'>alert(\'写入成功!!\');location.href=\'login.php\';</script>";    
049                 
050             
051          
052     //javascript:history.go(-1)    
053              
054         
055     ?>    
056          
057          
058     <form  action="reg.php" name="reg_form" method="post" onsubmit="return check_reg()">    
059     <table name="reg_table" align="left">    
060     <tr>    
061         <td>用户:</td><td><input id="username" name="username" class="myText"type="text" maxlength="12" /></td>    
062     </tr>    
063          
064     <tr> <!--性别:0 保密 1 女 2 男-->    
065          <td > 性别:</td>    
066          <td>女<input type="radio" value="1" name="sex"/>    
067              男<input type="radio" value="2" name="sex" />    
068            保密<input type="radio" value="0" name="sex"  checked/></td>    
069     </tr>    
070          
071     <tr>    
072         <td>密码:</td><td><input name="pass" class="myText" type="password"onblur="check_len(this)"/><span id="show_pass" style="color:red;"></span></td>    
073     </tr>    
074          
075     <tr>    
076         <td>重复密码:</td><td><input name="repass" class="myText" type="password"onblur="check_pass(this)" /><span id="show_repass" style="color:red;"></span></td>    
077     </tr>    
078          
079     <tr>    
080         <td>QQ:</td><td><input type="text" class="myText"  name="qq"onblur="check_qq(this)"/><span style="color:red;" id="show_qq"></span></td>    
081     </tr>    
082          
083     <tr>    
084         <td>邮箱:</td><td><input type="text" class="myText" name="email" onblur="check_email(this)"/><span id="show_e" style="color:red;"></span></td>    
085     </tr>    
086          
087     <tr>    
088         <td >头像:</td>    
089         <td>    
090         <select name="img_select" onchange="img_change(this)">    
091             <option value="101" >女 001</option>    
092             <option value="102" >女 002</option>    
093             <option value="103" >女 003</option>    
094             <option value="104" >女 004</option>    
095             <option value="105" >男 001</option>    
096             <option value="106" >男 002</option>    
097             <option value="107" >男 003</option>    
098             <option value="108" >男 004</option>    
099          </select>    
100          <img src="/bbs/img/101.gif" id="tx_change" style="width:50px; height:65px;"/>    
101         </td>    
102     </tr>    
103          
104     <tr  align="justify">    
105         <td align="right" ><input type="submit" value="注册" name="submit"style="margin-right:5px;"/></td>    
106         <td><input type="reset"  value="重置" name="reset" style="margin-left:5px;"/></td>    
107     </tr>    
108          
109     <tr>    
110         <td  colspan="2">我已有账号现在<a href="login.php">登录</a></td>    
111     </tr>    
112          
113     </table>    
114     </form>    
115     </body>    
116     </html>    
fun.js的代码如下:

01    //根据下拉框变换图片    
02     function img_change(thisObj)    
03         var imgsrc = "/bbs/img/"+ thisObj.value+".gif";    
04         document.getElementById("tx_change").src=imgsrc;       
05         
06          
07     //检查是否都符合 注册 要求    
08     function check_reg()    
09         
10     if(check_len() && check_pass() && check_email() && check_qq())    
11         
12         return true;       
13     else    
14         return false;    
15             
16         
17          
18     //检查密码长度不能少于6    
19     function check_len(thisObj)    
20         if(thisObj.value.length==0)    
21             
22             document.getElementById(\'show_pass\').innerHTML="密码不能为空";    
23             return false;    
24         else    
25         if (thisObj.value.length<6)    
26             
27             document.getElementById(\'show_pass\').innerHTML="密码长度不少于6";    
28             return false;    
29             
30             document.getElementById(\'show_pass\').innerHTML="";       
31             return true;    
32               
33         
34          
35     //检查俩次密码输入是否一致    
36     function check_pass(thisObj)    
37         var psw=document.getElementById(\'pass\');    
38         if(psw.value.length==0)    
39             
40             document.getElementById(\'show_pass\').innerHTML="密码不能为空";    
41             return false;    
42         else    
43             document.getElementById(\'show_pass\').innerHTML="";       
44          
45         if (thisObj.value!=psw.value)    
46             
47             document.getElementById(\'show_repass\').innerHTML="两次密码输入不正确";    
48             return false;    
49             
50             document.getElementById(\'show_repass\').innerHTML="";    
51             return true;    
52             
53         
54          
55     //检查email是否正确    
56     function check_email(thisObj)    
57         var reg=/^([a-zA-Z\\d][a-zA-Z0-9_]+@[a-zA-Z\\d]+(\\.[a-zA-Z\\d]+)+)$/gi;       
58         var rzt=thisObj.value.match(reg);    
59         if(thisObj.value.length==0)    
60             document.getElementById(\'show_e\').innerHTML="Email不能为空";    
61             return false;    
62             else    
63         if (rzt==null)    
64             
65             document.getElementById(\'show_e\').innerHTML="Email地址不正确";    
66             return false;    
67             
68             document.getElementById(\'show_e\').innerHTML="";    
69             return true;    
70           
71          
72         
73          
74     //检查qq格式是否正确    
75     function check_qq(thisObj)    
76         var qq=document.getElementById(\'qq\').value;    
77         var reg=/^\\d+$/;    
78         if(qq.search(reg))    
79             
80             document.getElementById(\'show_qq\').innerHTML=" QQ 只能为数字";    
81             return false;    
82         else    
83             document.getElementById(\'show_qq\').innerHTML="";    
84             return true ;    
85                 
86              
87              
88     
参考技术A 从数据里面去提取指定的用户名和密码,如果不存在就是用户名或者密码错误,存在就是正确。本回答被提问者采纳 参考技术B

1.前端表单form提交用户名到php页面

<form action="test.php" method="post">
用户名:<input name="user" type="text" >
密  码:<input name="password" type="password">
<input type="submit" value="提交">

2.test.php页面

<?php
//首先要连接数据库,这里省略
$name=$_POST['user'];//得到用户名,然后就可以通过查询语句在数据库里查询了
?>

需要会基本的sql查询语句

用户微服务用户注册功能实现

文章目录


用户注册之前需要先给注册的手机号发送一条验证码,我们把验证码存储在Redis中。
发送的时候我们先把验证码存储到Redis,然后用户发起注册的时候取出验证。

发送验证码

Redis配置如下:

package com.zjq.users.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * redis配置类
 * @author zjq
 */
@Configuration
public class RedisTemplateConfiguration 
    /**
     * redisTemplate 序列化使用的jdkSerializeable, 存储二进制字节码, 所以自定义序列化类
     * @param redisConnectionFactory
     * @return
     */
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) 
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);

        // 使用Jackson2JsonRedisSerialize 替换默认序列化
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);

        // 设置key和value的序列化规则
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setKeySerializer(new StringRedisSerializer());

        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);

        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    


新建一个service实现发送验证码功能:

  1. 根据手机号查询是否已生成验证码,已生成直接返回
  2. 没有生成则生成6位验证码
  3. 调用短信服务发送短信
  4. 发送成功,将code保存至Redis,失效时间60s

代码实现如下:

/**
 * 发送验证码业务逻辑层
 * @author zjq
 */
@Service
public class SendVerifyCodeService 

    @Resource
    private RedisTemplate<String, String> redisTemplate;

    /**
     * 发送验证码
     *
     * @param phone
     */
    public void send(String phone) 
        // 检查非空
        AssertUtil.isNotEmpty(phone, "手机号不能为空");
        // 根据手机号查询是否已生成验证码,已生成直接返回
        if (!checkCodeIsExpired(phone)) 
            return;
        
        // 生成 6 位验证码
        String code = RandomUtil.randomNumbers(6);
        // 调用短信服务发送短信
        // 发送成功,将 code 保存至 Redis,失效时间 60s
        String key = RedisKeyConstant.verify_code.getKey() + phone;
        redisTemplate.opsForValue().set(key, code, 60, TimeUnit.SECONDS);
    

    /**
     * 根据手机号查询是否已生成验证码
     *
     * @param phone
     * @return
     */
    private boolean checkCodeIsExpired(String phone) 
        String key = RedisKeyConstant.verify_code.getKey() + phone;
        String code = redisTemplate.opsForValue().get(key);
        return StrUtil.isBlank(code) ? true : false;
    

    /**
     * 根据手机号获取验证码
     *
     * @param phone
     * @return
     */
    public String getCodeByPhone(String phone) 
        String key = RedisKeyConstant.verify_code.getKey() + phone;
        return redisTemplate.opsForValue().get(key);
    


使用到的枚举类RedisKeyConstant

@Getter
public enum RedisKeyConstant 

    verify_code("verify_code:", "验证码");

    private String key;
    private String desc;

    RedisKeyConstant(String key, String desc) 
        this.key = key;
        this.desc = desc;
    


发送验证码的控制层代码如下:

/**
 * 发送验证码控制层
 * @author zjq
 */
@RestController
public class SendVerifyCodeController 

    @Resource
    private SendVerifyCodeService sendVerifyCodeService;

    @Resource
    private HttpServletRequest request;

    /**
     * 发送验证码
     *
     * @param phone
     * @return
     */
    @GetMapping("send")
    public ResultInfo send(String phone) 
        sendVerifyCodeService.send(phone);
        return ResultInfoUtil.buildSuccess("发送成功", request.getServletPath());
    


发送验证码接口,需要配置网关放放行发送验证码接口/users/send,配置如下:

secure:
  ignore:
    urls: # 配置白名单路径
      - /actuator/**
      - /auth/oauth/**
      - /users/signin
      - /users/send

验证发送:

在Redis中也可以查看到该手机号发送的验证码信息:

接下来继续走用户注册流程…

用户注册

校验手机号是否已注册或者不是可用状态

在mapper中新建一个通过手机号查询用户的方法:

    /**
     * 根据手机号查询用户信息
     * @param phone
     * @return
     */
    @Select("select id, username, phone, email, is_valid " +
            " from t_users where phone = #phone")
    Users selectByPhone(@Param("phone") String phone);

在service中创建校验手机号相关方法:

    /**
     * 校验手机号是否已注册
     */
    public void checkPhoneIsRegistered(String phone) 
        AssertUtil.isNotEmpty(phone, "手机号不能为空");
        Users diners = usersMapper.selectByPhone(phone);
        AssertUtil.isTrue(diners == null, "该手机号未注册");
        AssertUtil.isTrue(diners.getIsValid() == 0, "该用户已锁定,请先解锁");
    

控制层创建相关接口,提供验证:

    /**
     * 校验手机号是否已注册
     *
     * @param phone
     * @return
     */
    @GetMapping("checkPhone")
    public ResultInfo checkPhone(String phone) 
        userService.checkPhoneIsRegistered(phone);
        return ResultInfoUtil.buildSuccess(request.getServletPath());
    

网关同样需要配置放行该接口:

secure:
  ignore:
    urls: # 配置白名单路径
      - /actuator/**
      - /auth/oauth/**
      - /users/signin
      - /users/send
      - /users/checkPhone

此时数据库信息如下:

测试验证:
已存在的手机号:

不存在的手机号:


这个异常显然不够友好,接下来我们定义全局异常配置。

全局异常配置

添加全局异常处理类,代码如下:

/**
 * 全局异常处理类
 * @author zjq
 */
@RestControllerAdvice 
@Slf4j
public class GlobalExceptionHandler 

    @Resource
    private HttpServletRequest request;

    @ExceptionHandler(ParameterException.class)
    public ResultInfo<Map<String, String>> handlerParameterException(ParameterException ex) 
        String path = request.getRequestURI();
        ResultInfo<Map<String, String>> resultInfo =
                ResultInfoUtil.buildError(ex.getErrorCode(), ex.getMessage(), path);
        return resultInfo;
    

    @ExceptionHandler(Exception.class)
    public ResultInfo<Map<String, String>> handlerException(Exception ex) 
        log.info("未知异常:", ex);
        String path = request.getRequestURI();
        ResultInfo<Map<String, String>> resultInfo =
                ResultInfoUtil.buildError(path);
        return resultInfo;
    


再次请求不存在的手机号,或者已经被锁定的手机号,返回如下:

查看用户名是否已经注册

在mapper中添加根据用户名查询用户:

    /**
     * 根据用户名查询用户信息
     * @param username
     * @return
     */
    @Select("select id, username, phone, email, is_valid " +
            " from t_users where username = #username")
    Users selectByUsername(@Param("username") String username);

用户注册验证都通过后需要把新用户添加到数据库,mapper中添加用户新增信息:

    /**
     * 新增用户信息
     * @param userDTO
     * @return
     */
    @Insert("insert into " +
            " t_users (username, password, phone, roles, is_valid, create_date, update_date) " +
            " values (#username, #password, #phone, \\"ROLE_USER\\", 1, now(), now())")
    int saveUser(UserDTO userDTO);

UserDTO内容如下:

package com.imooc.commons.model.dto;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;

import java.io.Serializable;

@Getter
@Setter
@ApiModel(description = "注册用户信息")
public class DinersDTO implements Serializable 

    @ApiModelProperty("用户名")
    private String username;
    @ApiModelProperty("密码")
    private String password;
    @ApiModelProperty("手机号")
    private String phone;
    @ApiModelProperty("验证码")
    private String verifyCode;


用户注册逻辑实现

用户注册步骤如下:

  1. 参数非空校验
  2. 验证码一致性校验
  3. 验证用户名是否已注册
  4. 注册
  5. 密码加密
  6. 自动登录

代码实现如下:

    /**
     * 用户注册
     *
     * @param userDTO
     * @param path
     * @return
     */
    public ResultInfo register(UserDTO userDTO, String path) 
        // 参数非空校验
        String username = userDTO.getUsername();
        AssertUtil.isNotEmpty(username, "请输入用户名");
        String password = userDTO.getPassword();
        AssertUtil.isNotEmpty(password, "请输入密码");
        String phone = userDTO.getPhone();
        AssertUtil.isNotEmpty(phone, "请输入手机号");
        String verifyCode = userDTO.getVerifyCode();
        AssertUtil.isNotEmpty(verifyCode, "请输入验证码");
        // 获取验证码
        String code = sendVerifyCodeService.getCodeByPhone(phone);
        // 验证是否过期
        AssertUtil.isNotEmpty(code, "验证码已过期,请重新发送");
        // 验证码一致性校验
        AssertUtil.isTrue(!userDTO.getVerifyCode().equals(code), "验证码不一致,请重新输入");
        // 验证用户名是否已注册
        Users users = usersMapper.selectByUsername(username.trim());
        AssertUtil.isTrue(users != null, "用户名已存在,请重新输入");
        // 注册
        // 密码加密
        userDTO.setPassword(DigestUtil.md5Hex(password.trim()));
        usersMapper.saveUser(userDTO);
        // 自动登录
        return signIn(username.trim(), password.trim(), path);
    

控制层代码如下:

    /**
     * 注册
     *
     * @param userDTO
     * @return
     */
    @PostMapping("register")
    public ResultInfo register(@RequestBody UserDTO userDTO) 
        return userService.register(userDTO, request.getServletPath());
    

验证

新用户发起注册。
校验手机号是否已注册:

发送验证码:

执行注册操作:
可以看到验证码为 807596:

第一次故意等待验证码失效再执行,返回如下:

然后重新发送验证码:

再次输入错误验证码,返回如下:

输入正确的,返回了自动登录的token信息:

本文内容到此结束了,
如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。
如有错误❌疑问💬欢迎各位指出。
主页共饮一杯无的博客汇总👨‍💻

保持热爱,奔赴下一场山海。🏃🏃🏃

以上是关于php注册的时候怎么验证用户名是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

怎么验证用户名是不是存在

php怎么获取钉钉员工授权信息?

如何判断用户名是不是在数据库中已经存在呢JSP

php form提交账户密码 怎么写验证

网页中注册界面中如何检测用户名已存在

asp注册验证用户名是不是重复的Ajax实例