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实现发送验证码功能:
- 根据手机号查询是否已生成验证码,已生成直接返回
- 没有生成则生成6位验证码
- 调用短信服务发送短信
- 发送成功,将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;
用户注册逻辑实现
用户注册步骤如下:
- 参数非空校验
- 验证码一致性校验
- 验证用户名是否已注册
- 注册
- 密码加密
- 自动登录
代码实现如下:
/**
* 用户注册
*
* @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注册的时候怎么验证用户名是不是存在的主要内容,如果未能解决你的问题,请参考以下文章