PHP系列:PHP实现登录和注册(附源码)(二)用户登录和注册功能
PHP实现登录和注册(附源码)(二)用户登录和注册功能
PHP实现登录和注册(附源码)
接上篇
PHP系列:PHP实现登录和注册(附源码)(一) 安装phpstudy、创建网站
3. 用户登录和注册功能
3.1 思路
在写这个功能时,我们来理清一下大致思路
-
新用户需要注册,把注册时的数据如用户名,密码和邮箱存放在数据库中
-
已经注册过的用户可以直接登录,登录这里的用户名和密码需要和数据库中的数据进行验证,可以在php文件中写验证规则
-
验证用户名的唯一性,若用户名不存在,则不允许登录
-
用户名正确,若密码错误也不允许登录,密码存在后端的数据库中
接下来一步一步来实现具体的功能
3.2 准备阶段
在phpstudy
中新建一个网站,这里我建立了一个网站域名为 localhost
,端口号为 80 的网站,在该文件夹中新建一个名叫 re_login
的文件,然后拖动该文件在 VSCode
中打开,建立几个必要的文件,如下图:
index.html 为入口文件,这里主要编写前端登录页面
register.html 为跳转页面,是注册的前端的页面
login.php 用于验证用户登录时的数据验证,结合数据库的验证
register.php 对注册信息的验证,及操作数据库,把成功注册的数据保存到数据库中
xiaomi.html 为用户成功登录后显示的网页
3.3 前端部分
3.3.1 登录的前端页面
效果图如下:
代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>登录</title>
<style>
form{
max-width: 400px;
height: 300px;
background-color: rgba(247, 247, 247, 0.7);
border: 1 solid #E4E4E4;
margin: 100px auto;
color: black;
border-radius: 5px;
padding: 25px 45px;
}
body{
background-repeat: no-repeat;
background-image: url(xingkong.png);
background-size: 100%;
}
div{
width: 100%;
height: 35px;
line-height: 35px;
margin-top: 50px;
position: relative;
}
input{
position: absolute;
right: 80px;
width: 60%;
height: 25px;
line-height: 25px;
border: 1px solid #DADADA;
color: #888;
outline: none;
font-size: 12px;
padding: 3px 3px 3px 5px;
box-shadow: inset 0 1px 4px #ECECEC;
}
input[type="submit"]{
width: 50%;
height: 40px;
line-height: 15px;
font-size: 15px;
background-color: #b5ccf3;
border: none;
box-shadow: none;
border-radius: 10px;
color: #FFF;
position: relative;
top: 50px;
left: 50%;
transform: translateX(-50%);
}
input[type="submit"]:hover{
cursor: pointer; /*手型*/
background-color: rgb(139, 205, 246);
}
a{
width: 180px;
display: block;
margin: 80px auto;
}
</style>
</head>
<body>
<form action="./login.php" method="post">
<div>
<label for="name">用户名:</label>
<input type="text" id="name" name="name" placeholder="请输入用户名" required>
</div>
<div>
<label for="pass">密 码:</label>
<input type="password" name="pass" id="pass" placeholder="请输入密码" required>
</div>
<input type="submit" name="login" value="登录">
<a href="register.html">还没有账号,注册一个</a>
</form>
</body>
</html>
代码解释:
-
因为实现的简单的页面,直接在当前头文件编写
CSS代码
就好了 -
建立一个
form表单
,用于提交数据进行验证 -
action
提交的地址,提交到login.php
中进行登录的验证,以post
的方式发送数据 -
用户名和密码输入框中都添加了
required 属性
,设置该字段不能为空(如下图) -
给登录按钮设置标识“
login
”,方便后面获取
写完登录的前端代码之后,在网页中输入如下代码即可进入该页面(如上图登录页面)
http://localhost/re_login/register.html
3.3.2 注册的前端页面
效果图如下:
代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>注册</title>
<style>
form{
max-width: 400px;
height: 350px;
background-color: rgba(247, 247, 247, 0.7);
border: 1 solid #E4E4E4;
margin: 100px auto;
color: black;
border-radius: 5px;
padding: 25px 45px;
}
body{
background-repeat: no-repeat;
background-image: url(xingkong.png);
background-size: 100%;
}
div{
width: 100%;
height: 35px;
line-height: 35px;
margin-top: 20px;
position: relative;
}
input{
position: absolute;
right: 80px;
width: 60%;
height: 25px;
line-height: 25px;
border: 1px solid #DADADA;
color: #888;
outline: none;
font-size: 12px;
padding: 3px 3px 3px 5px;
box-shadow: inset 0 1px 4px #ECECEC;
}
input[type="submit"]{
width: 50%;
height: 40px;
line-height: 15px;
font-size: 15px;
background-color: #b5ccf3;
border: none;
box-shadow: none;
border-radius: 10px;
color: #FFF;
position: relative;
top: 50px;
left: 50%;
transform: translateX(-50%);
}
input[type="submit"]:hover{
cursor: pointer; /*手型*/
background-color: rgb(139, 205, 246);
}
a{
width: 180px;
display: block;
margin: 80px auto;
}
</style>
</head>
<body>
<form action="register.php" method="post" novalidate>
<div>
<label for="name">用户名:</label>
<input type="text" id="name" name="name" placeholder="请输入用户名" required>
</div>
<div>
<label for="pass">密 码:</label>
<input type="password" name="pass" id="pass" placeholder="请输入密码" required>
</div>
<div>
<label for="qpass">密 码:</label>
<input type="password" name="qpass" id="qpass" placeholder="请输入密码" required>
</div>
<div>
<label for="email">邮 箱</label>
<input type="email" id="email" name="email" placeholder="请输入邮箱" pattern="[^@]*@[^@]*[\.com$]" required>
</div>
<input type="submit" name="reg" value="注册">
<a href="./index.html">已经有账号了,去登录</a>
</form>
</body>
</html>
代码解释:
和登录页面差不多,就是多了确认密码和邮箱这两个输入框以及一些其他区别
-
与登录页面不同的是,在注册的
from 表单
中,加了novalidate 属性
,该属性是去掉from 表单
自带的验证功能,防止数据卡在前端到不了后端进行验证 -
表单提交的地址是
register.php
,在该文件中编写代码对注册的数据进一步验证,以及把能正确注册的用户数据保存到数据库中,方便在登录时进行数据验证 -
其他基本与登录的代码含义大差不差
pattern
是自己写的验证规则,中括号中写正则表达式。pattern="[^@]*@[^@]*[\.com$]"
对邮箱的验证写规则,@符号
的前后不能再出现@符号,而且必须以.com
为后缀,当然验证规则可以自己写,改一下正则表达式即可。
写完登录的前端代码之后,在网页中输入如下代码即可进入该页面(如上图登录页面)
http://localhost/re_login/register.html
也可以点击 “还没有账号,注册一个” 这个超链接实现注册页面的跳转。
3.4 验证注册的数据
3.4.1 设置验证规则
到这里,我们就开始编写 php 代码
了。在register.php
中编写 php 代码
。
首先,我们把注册时传动过来的数据进行验证,注册时有用户名、密码、确认密码、邮箱这四个数据,可以使用 if 来进行规则验证。
(1)、注册时的用户名不能为空,可使用函数 empty()
来检验数据是否为空。如果为空,则函数返回为真,if 语句成立,代表着用户名为空,则输入提示信息并且让程序结束掉、
$_POST
是预定义的变量,用于收集来自 method="post"
的表单中的值。
if(empty($_POST["name"])){
die("用户名不能为空!");
}
跳转到register.php
文件去执行,输入提示信息
(2)、注册时的密码不能为小于6位数(可自行设定)。
if(strlen($_POST["pass"]) < 6){
die("密码不能小于6位!!");
}
验证和用户名基本一致
(3)、验证两次密码输入是否一样。把 post 过来的数据进行 逻辑判断
if($_POST["pass"] !== $_POST["qpass"]){
die("两次输入的密码不一致!");
}
(4)、验证邮箱的有效性
if(!filter_var($_POST["email"],FILTER_VALIDATE_EMAIL)){
die("请输入有效的邮箱格式!");
}
filter_var() 函数通过指定的过滤器过滤一个变量。第一个参数是规定要过滤的变量,第二个参数是规定要使用的过滤器的
ID。FILTER_VALIDATE_EMAIL是把值作为 e-mail 地址来验证。如果函数返回真则是有效的email地址,验证通过
(5)、保护密码
$pass_hash=password_hash($_POST["pass"],PASSWORD_DEFAULT);
password_hash
函数是对密码进行加密的函数,形成一串没有规律、杂乱的字符串,保证了用户信息的安全性。PASSWORD_DEFAULT是一种加密规则。返回来的字符串用一个变量保存起来,方便后面传到数据库中
下图就是注册后,密码加密后显示的字符串
3.4.2 phpMyAdmin 管理数据库
使用数据库管理工具 phpMyAdmin 工具
管理数据库。首先在 PHP
集成包中下载 phpMyAdmin 工具
安装位置一般选择在 WWW 文件
下。然后点击管理,就会跳出要登录的页面,用户名和密码默认是 root 就可以直接登录了。当然也可以修改密码,在数据库一栏中,点击修改密码再输入新密码即可
进入到数据库管理页面后,新建一个数据库,名字自拟,然后在该数据中新建一张表,用来存放用户注册的信息。然后点击右下角的保存即可
3.4.3 PHP 连接数据库
编写 PHP 代码来连接数据库
$mysqli = new mysqli("localhost","root","root","lo_db");
if($mysqli->connect_error){
die("数据库连接错误:". $mysqli->connect_error);
}
实例化一个数据库对象;localhost
为本地服务器上的数据库,第一个 root
是用户名,第二个 root
是密码,lo_db
是要连接的数据库名
mysqli->connect_error
是一个在 PHP
中使用对象范式的方式来检查 MySQLi 数据库
连接时是否发生错误的函数。使用 if 语句
来判断,返回值为假的话说明连接数据库失败,打印连接失败的原因(保证用户名和密码以及数据库名的正确性)
数据库连接成功后,还不能把信息往数据表里面存放。
3.4.4 保存注册的数据到数据库中
$name = $_POST["name"];
$mail = $_POST["email"];
if(isset($_POST["reg"])){
$sql = "INSERT INTO tuser (name,email,pass_hash) VALUES ('$name','$mail','$pass_hash')";
$mysqli->query($sql);
if($mysqli->affected_rows > 0){
echo "<script>alert('注册成功!');history.go(-1);</script>";
}
}
-
声明两个变量用来保存用户名和密码,接着检测用户是否点击了注册这个按钮,如果点击的话就把能成功注册的数据传到数据表中。
-
isset() 函数
用于检测变量是否已设置并且非 NULL
。 -
sql 变量
用来保存用户的信息,接着是SQL 语句
,向指定表(tuser
)中添加对应的值 -
$mysqli->query($sql)
执行SQL 语句
-
用
affected_row
来判断是否新增了数据行,新增的话则表示注册成功,数据也成功存放到数据表中,并打印提示信息。
如下图是已经注册过的用户:
自此,注册的功能就实现好了。下面是注册功能 register.php
的完整代码
<?php
/* 判断用户名是否为空*/
if(empty($_POST["name"])){
die("用户名不能为空!");
}
/* 对密码进行规则验证*/
if(strlen($_POST["pass"]) < 6){
die("密码不能小于6位!!");
}
/* 判断输入的两次密码是否一致*/
if($_POST["pass"] !== $_POST["qpass"]){
die("两次输入的密码不一致!");
}
/* 验证邮箱的有效性*/
if(!filter_var($_POST["email"],FILTER_VALIDATE_EMAIL)){
die("请输入有效的邮箱格式!");
}
/* 对密码加密,保证数据的安全*/
$pass_hash=password_hash($_POST["pass"],PASSWORD_DEFAULT);
/* 保存用户的数据*/
$name = $_POST["name"];
$mail = $_POST["email"];
/* 连接数据库*/
$mysqli = new mysqli("localhost","root","root","lo_db");
if($mysqli->connect_error){
die("数据库连接错误:". $mysqli->connect_error);
}
/* 向数据表中传入用户的数据,方便后面对登录进行验证*/
if(isset($_POST["reg"])){
$sql = "INSERT INTO tuser (name,email,pass_hash) VALUES ('$name','$mail','$pass_hash')";
$mysqli->query($sql);
if($mysqli->affected_rows > 0){
echo "<script>alert('注册成功!');history.go(-1);</script>";
}
}
3.5 登录验证
登录功能同样需要连接到数据库。我们直接把在写注册功能时连接数据库的代码拷贝过来即可
$mysqli = new mysqli("localhost","root","root","lo_db");
if($mysqli->connect_error){
die("数据库连接错误:". $mysqli->connect_error);
}
$pass_hash=password_hash($_POST["pass"],PASSWORD_DEFAULT);
$name = $_POST["name"];
这里只需要声明两个变量就行,一个用来保存用户名,一个用来保存登录的密码。接着来检查用户是否点击了登录这个按钮,和上面注册的代码差不多,用 if
来判断,如果用户点击了登录这个按钮,就写一个 sql 语句
,然后用 query 函数
发送数据到数据库中去执行,再用 fetch_assoc 函数
返回一个结果集,用一个变量来保存这个结果集,代码如下:
if(isset($_POST["login"])){
$sql = "SELECT pass_hash FROM tuser WHERE name='$name'";
$res =$mysqli->query($sql)->fetch_assoc();
}
接着来判断返回的这个结果值是否为真,为真则在数据库中找到当前用户输入的用户名在数据库中是否存在,不存在则结束进程,并打印提示信息:“用户不存在”;若输入的用户名存在则进一步判断输入的密码是否正确。我们一下就可以想到可以用
if-else
来进行写
代码如下:
if($res){
if(password_verify($_POST["pass"],$res["pass_hash"])){
echo "<script>alert('登录成功!') ;window.location.href='xiaomi.html';</script>";
}else{
echo "<script>alert('密码错误!');history.go(-1);</script>";
}
}else{
echo "<script>alert('用户不存在!');history.go(-1);</script>";
}
password_verify($_POST["pass"],$res["pass_hash")----password_verify() 函数
用于验证密码是否和散列值匹配。pass_hash
是我们在注册时把密码变成一个散列值存放在数据库中,password_verify()函数
则用来验证本次输入的密码映射成的散列值和在数据库中密码的散列值是否相等,相同则表示登录成功,跳转到xiaomi.html页面
(该页面是本人联系HTML+CSS
写的,用来测试登录成功的页面,大家可以放入其他自己写的网页来进行测试)
ps:上面这个 if 语句
其实可以放在判断用户是否点击登录按钮的 if 语句
中,意思就是要是用户连登录按钮都没点,也没必要验证其他的东西,$res
的值必然为空
下面是完整的登录验证 PHP 代码
:
<?php
/* 连接数据库*/
$mysqli = new mysqli("localhost","root","root","lo_db");
if($mysqli->connect_error){
die("数据库连接错误:". $mysqli->connect_error);
}
$pass_hash=password_hash($_POST["pass"],PASSWORD_DEFAULT);
$name = $_POST["name"];
/* 判断用户是否点击了登录按钮*/
if(isset($_POST["login"])){
$sql = "SELECT pass_hash FROM tuser WHERE name='$name'";
$res =$mysqli->query($sql)->fetch_assoc();
/**登录验证 */
if($res){
if(password_verify($_POST["pass"],$res["pass_hash"])){
echo "<script>alert('登录成功!') ;window.location.href='xiaomi.html';</script>";
}else{
echo "<script>alert('密码错误!');history.go(-1);</script>";
}
}else{
echo "<script>alert('用户不存在!');history.go(-1);</script>";
}
}
到这里,整个php环境
下写登录注册功能的过程就已经结束了,我上传了本篇实例的一些资源包,如果能帮到和我一样的新手小白,我会非常开心!该案例非常适合新手练习,也欢迎大佬们看到错误或者不妥的地方能批评指正。
资源包链接:链接:https://pan.baidu.com/s/1HhW0VV4rU60eiab0UsnYYw?pwd=1689
提取码:1689
案例教学参教视频:
【跟师兄做一个注册登录功能~~前端部分-哔哩哔哩】 https://b23.tv/CNHvTeT
【跟师兄做一个注册登录功能~~后端部分-哔哩哔哩】 https://b23.tv/CYgKSDf
总结
该案例结合了前端+后端+数据库
来实现的用户登录和注册功能,利用的是PHP集成包工具来搭建环境,在此环境之下实现。也可以利用 JavaWeb
来实现该功能,当然这比本博客介绍的实现方法偏难,大家可以去尝试一下,今后我也会去学到
我在搭建 PHP 环境
的时候出现了很多的错误,一开始尝试不用 phpMyAdmin
来管理数据库,尝试用数据库可视化工具—— navicat
来建立数据库,然后在 PHPstudy
中建立数据库,编写php来连接数据库,但是后面遇到了各种各样的错误,什么数据库密码不正确,数据库不存在,还有无法连接数据库(1045-access denied …)、服务名无效等;甚至后面我重装了mysql服务
,后面还是觉得用 phpMyAmind
更香,大家遇到什么问题的话多去搜搜,只有去搜了才能解决问题(没解决更焦虑)
最后,每篇一言:世上无难事,只怕有心人。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)