【PHP【实战项目】系统性教学】——使用最精简的代码完成用户的登录与退出
👨💻个人主页:@开发者-曼亿点
👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!
👨💻 本文由 曼亿点 原创
👨💻 收录于专栏:PHP程序开发
⭐🅰⭐
—
文章目录
- ⭐🅰⭐
- ⭐前言⭐
- 🎶一、 会话的定义
- 🎶二、 启动会话
- 🎶三、 会话变量
- 🎶四、删除会话
- 🎶五、首页登录凭证验证
- 🎶六、创建登录首页
- 🎶七、登录验证
- 🎶八、退出登录
- 结束语🥇
⭐前言⭐
如果用户进入需要密码登录凭证的页面,此时就要求用户输入账号和密码进行登录,否则用户无权访问。因此用户登录成功后,需要保留一个登录凭证,以便在各个页面之间进行请求操作。
由于HTTP是一种无状态的请求——响应协议,没有办法记录多个事务请求之间的状态。即访问一个一个页面请求再请求另外一个页面时无法判断两次请求来自同一个用户。通过使用会哈技术,可以将来自同一浏览器的请求联系起来。
🎶一、 会话的定义
PHP中的session会话包括包含以下两个部分:
①会话ID:是加密的随机数,由PHP生成,在会话的生命周期中都会保存在客户端。
②session:保存登录信息,存放在服务器。
当用户登录成功时,PHP启动会话,这样就可以实现全局预定义$ _SESSION中存储登录凭证,同时PHP还会给这个会话生成一个加密的ID发送给浏览器,用于浏览器与此会话的联系,浏览器关闭后这个ID也回被销毁,所以浏览器关闭后,都需要重新登录系统。
当没有关闭浏览器,且用户再次访问其他页面时,回携带此ID,此时服务器会依据ID获得对于的对话,从会话中读取用户登录凭证进行判断。
🎶二、 启动会话
把登录信息存储到PHP session中之前,必须通过sesion_start( )启动会话。sesion_start( )函数必须位于标签之前,且前面不能有任何输出,下面通过编写一个没有启动的会话和启动的会话的案例代码查看两者的区别。
(1)没有启动的会话:
<!DOCTYPE html>
<html><head><meta charset="utf-8"><!-- 让网页的宽度自动适应手机屏幕的宽度 --><meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=0"><title>没有启动会话</title></head><body>没有启动会话</body>
</html>
(2)启动的会话:
定义一个for循环访问数组:
<?php
//启动会话
session_start();
?>
<!DOCTYPE html>
<html><head><meta charset="utf-8"><!-- 让网页的宽度自动适应手机屏幕的宽度 --><meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=0"><title>没有启动会话</title></head><body>没有启动会话</body>
</html>
🎶三、 会话变量
如果会话不存储用户的信息,那么就传递会话ID,服务器并不能判断当前访问的用户是谁。会话启动后,应该将用户的保存在PHP全局预定义的数组$_SESSION中如下例案例代码模拟了页面·访问次数。如果第一次登录(关闭浏览器访问案例代码),保存登录凭证,计数为1;如果浏览器登录案例代码后,刷新当前页面,此处登录凭证还存在,计数为1;
(1)刷新会话计数加1
<?php//启动会话
session_start();
//判断是否存在用户的登录凭证,如果存在count加1
if(isset($_SESSION['login_status'])){//用户登录后,再次访问页面$_SESSION['login_status']['count']++;
}else{//用户第一次登录访问,模拟保存用户信息$_SESSION['login_status']=array('id'=>'1','name'=>'杨浪','tel'=>'143243243','cout'=>'1');
}
?>
<!DOCTYPE html>
<html><head><meta charset="utf-8"><!-- 让网页的宽度自动适应手机屏幕的宽度 --><meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=0"><title>启动会话</title></head><body><?phpecho $_SESSION['login_status']['name'].",欢迎你,"."这是你在此页面留下的笔".$_SESSION['login_status']['count']."次脚印!";?></body>
</html>
案列效果图如下图所示。在不关闭浏览器的情况下,如果服务器发送会话ID,后面的请求将不会发送新的会话ID。
🎶四、删除会话
如果希望删除某些session数据,可以使用unset()或者session_destroy()函数。unset()函数用于释放指定的sesion变量,session_destroy( )函数彻底销毁session。删除会话的用法将会在案列中实施。
🎶五、首页登录凭证验证
使用WEUI的底部导航构建首页面,之间拷贝对应的资源,在顶部编写PHP代码,启动会话,并判断是否存在登录凭证,如果1不存在就跳到登录页面,如果存在,则进入首页面,并在顶部页面显示用户欢迎页面。
在这里,约定登录凭证保存在session数组中的login_statuis键中,并且登录凭证是一组数据,存放登录用户的ID和姓名。
(1)给首页添加验证【index.php】
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>首页面</title><meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=0"><link rel="stylesheet" href="css/weui.css" /><!-- 自定义的css --><link rel="stylesheet" href="css/demo.css" /></head><body ontouchstart><?php//通过session获取登录信息session_start();$data=$_SESSION['login_status'];if($data==null){header("Refresh:1,Url=del.php");}?><div class="page__bd" style="margin: 10px;"><div class="weui-cells"><div class="weui-cell"><div class="weui-cell__hd"><img src="images/me.png" alt=""></div><div class="weui-cell__bd"><span><?php echo $data['name']?></span><div><?php echo $data['tel']?></div></div> <div class="weui-cell__ft"><a style="color: red;" href="loginOut.php">退出</a></div> </div></div></div><div class="weui-tabbar" style="width: 100%; position: fixed; bottom: 0;"><div class="weui-tabbar__item"><div tyle="display: inline-block; position: relative;"><img src="./images/home.png" alt="" class="weui-tabbar__icon"></div><p class="weui-tabbar__label">首页</p></div><div class="weui-tabbar__item"><img src="./images/type.png" alt="" class="weui-tabbar__icon"><p class="weui-tabbar__label">分类</p></div><div class="weui-tabbar__item"><div style="display: inline-block; position: relative;"><img src="./images/car.png" alt="" class="weui-tabbar__icon"></div><p class="weui-tabbar__label">购物车</p></div><div class="weui-tabbar__item weui-bar__item_on"><img src="./images/me.png" alt="" class="weui-tabbar__icon"><p class="weui-tabbar__label">我</p></div></div></body>
</html>
🎶六、创建登录首页
新建html文件,在登录页面中使用WeUI表单组件构成,主键与表单注册页面类似,登录表单中包含电话和密码,登录时不使用表单提交方式,而是给按钮添加点击事件,在绑定事件login方法中使用AJAX POST提交登录信息。
(1)给首页添加验【del.php】:
<!DOCTYPE html>
<html><head><meta charset="utf-8"><!-- 让网页的宽度自动适应手机屏幕的宽度 --><meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=0"><title>用户注册</title><!-- 引入 本地 css文件 --><link rel="stylesheet" href="css/weui.css"/><link rel="stylesheet" href="jquery-confirm/jquery-confirm.css"/><!-- 引入本地js文件 --><script src="js/jquery-3.6.1.min.js"></script><script src="jquery-confirm/jquery-confirm.js"></script></head><body><form class="weui-form" id="login_form"><div class="weui-form__text-area"><h2 class="weui-form__title">用户登录</h2></div><div class="weui-form__control-area"><div class="weui-cells__group weui-cells__group_form"><div class="weui-cells"><label class="weui-cell"><div class="weui-cell__hd"><span class="weui-label">手机</span></div><div class="weui-cell__bd"><input class="weui-input" name="tel" placeholder="填写本人手机号" /></div></label><label class="weui-cell"><div class="weui-cell__hd"><span class="weui-label">密码</span></div><div class="weui-cell__bd"><input class="weui-input" name="pwd" placeholder="填写六位密码" type="password" /></div></label></div></div></div><div class="weui-form__tips-area"></div> <!-- 表单提示 --><div class="weui-form__opr-area"><button type="button" class="weui-btn weui-btn_primary" onclick="login()">登录</button></div></form><script>function login(){$.aler({titlr:'提示',content:'按下登录按钮!';})}</script></body>
</html>
🎶七、登录验证
在登录页面用户输入手机和密码,并按下登录键时,触发按钮onclick事件,调用login方法。在login方法中获取手机和密码,使用jQuery中的POST提交方法,将数据提交到修改登录页面进行处理。将获取的密码用MD5加密,然后拼接成查询语句执行。如果存在用户,将用户存储信息存储在会话中,并将执行结果返回调用页面,在此任务中需要修改给首页添加验证的代码。
修改login方法【del.php】:
<script>function login(){//获取表单的内容var tel=$('#login_form input[name=tel]').val();var pwd=$('#login_form input[name=pwd]').val();//表单内容通过ajax进行提交$.post("delyz.php",{"tel":tel,"pwd":pwd},function(res){//将PHP返回的JSON字符串解析成对象var obj=$.parseJSON(res);if(obj.success){ $.confirm({title:'登录提示!',content:obj.msg,buttons:{"确实":function(){//跳转到首页window.location="index.php"}}});}else{$.alert(obj.msg);}})}</script>
修改login方法的运行结果:
(2)给页面添加验证的数据库处理代码怕【delyz.php】:
<?php
// 默认返回前端的数据
$obj=array("success"=>false,"msg"=>"登录失败,用户名或密码错误请重新输入");
// 1.建立数据库shop连接
$conn=mysqli_connect("localhost","root","123456","shop");
//2.编写SQL语句
//获取电话号码和密码
$tel=$_POST['tel'];
$pwd=md5($_POST['pwd']);
$sql="select * from users where tel='$tel' and pwd='$pwd'";
// echo $sql;
//3.执行SQL语句,保存结果及对象
$rs=mysqli_query($conn,$sql);
//4.处理结果集如果存在查询的用户
if(mysqli_num_rows($rs)){//启动会话session_start();//将登录凭证保存//获取第一行数据$row=mysqli_fetch_array($rs);$_SESSION['login_status']=array("id"=>$row['Id'],"name"=>$row['name'],"tel"=>$row['tel'], );
$obj=array("success"=>true,"msg"=>"登录成功请点击进入首页");
}
echo json_encode($obj);
//释放资源,关闭连接
mysqli_free_result($rs);
mysqli_close($conn);
exit;
?>
运行结果图:
🎶八、退出登录
退出登录只需要销毁会话即可,在首页添加一个【退出】按钮链接,点击此按钮会调用登录界面,而首页会话将会销毁,3秒后跳转到登录页面。
(1)给首页添加验证代码【loginOut.php】:
<?php
session_start();
unset($_SESSION["login_status"]);
//页面3秒后进行跳转
header("Refresh:3,Url=del.php");
echo "退出成功,3秒后跳转到登录界面";
?>
运行结果:
结束语🥇
以上就是PHP程序设计
持续更新PHP程序设计教程,欢迎大家订阅系列专栏🔥PHP程序开发你们的支持就是曼亿点创作的动力💖💖💖
相关文章:

【PHP【实战项目】系统性教学】——使用最精简的代码完成用户的登录与退出
👨💻个人主页:开发者-曼亿点 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 曼亿点 原创 👨💻 收录于专栏:…...

Linux下的常用基本指令
基本指令 前言一、ls 指令语法功能常用选项举例注意要点关于拼接关于 -a关于文件ls与/的联用ls与根目录ls与任意文件夹ls与常用选项与路径 ls -d与ls -ldls与ll 二、pwd命令语法功能常用选项注意要点window与Linux文件路径的区别家目录 三、cd 指令语法功能举例注意要点cd路径.…...
phpstorm环境配置与应用
在 PhpStorm 中配置 PHP 开发环境及进行一些常用的应用设置涉及以下几个主要步骤: ### 1. 安装和激活 PhpStorm - **下载安装**: 访问 JetBrains 官网下载最新版本的 PhpStorm 安装包,然后按照提示进行安装。 - **激活**: 启动 PhpStorm,你可…...

【Qt 学习笔记】Qt常用控件 | 布局管理器 | 水平布局Horizontal Layout
博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt常用控件 | 布局管理器 | 水平布局Horizontal Layout 文章编号&…...

Hive Aggregation 聚合函数
Hive Aggregation 聚合函数 基础聚合 增强聚合...

Unity 性能优化之GPU Instancing(五)
提示:仅供参考,有误之处,麻烦大佬指出,不胜感激! 文章目录 前言一、GPU Instancing使用方法二、使用GPU Instancing的条件三、GPU Instancing弊端四、注意五、检查是否成功总结 前言 GPU Instancing也是一种Draw call…...

LeetCode 138. 随机链表的复制
目录 1.原题链接: 2.结点拆分: 代码实现: 3.提交结果: 4.读书分享: 1.原题链接: 138. 随机链表的复制 2.结点拆分: ①.拷贝各个结点,连接在原结点后面; ②.处…...
【PC微信小程序点不动处理方法】
描述 在使用电脑小程序抓包的时候发现原来能点的小程序今天不能点了。就是原来有个输入车牌号的输入框点击会出现车牌号键盘,现在不行了,经过卸载安装发现不是微信的问题,是WeChatAppEx.exe 的bug。早期使用的是不带ex的都没有问题升级以后&…...

量化交易:日内网格交易策略.md
哈喽,大家好,我是木头左! 本文将详细介绍日内网格交易策略的原理,并结合Python代码示例,展示如何在掘金平台上实现这一策略。 策略原理 日内网格交易策略的核心思想是在一天的交易时间内,通过设置多个买卖…...

Ubuntu 20.04在Anaconda虚拟环境中配置PyQt4
一、创建一个虚拟环境 1 创建一个python2.7的虚拟环境: conda create -n pyqt4 numpy matplotlib python2.72 在环境中安装几个需要的包: pip install Theano pip install python-opencv3.4.0.14 pip install qdarkstyle pip install dominate二、在主…...

charts3D地球--添加航线
要在地球视角下画出海运路线图 方案 添加 globl 地球创建geo地理坐标系创建canvas对象用于承载地图世界地图this.worldChart //初始化canvas节点let cav document.createElement("canvas");this.$echarts.registerMap("world", geoJson);this.worldCha…...

变色龙还是树懒:揭示大型语言模型在知识冲突中的行为
你是知识变色龙还是树懒?我今天在ICLR学到一个很有趣的术语,叫做证据顺序(order of evidence)。 大模型RAG处理知识冲突的探讨: 在检索增强生成(Retrieval-Augmented Generation, RAG)的过程中,技术团队会将检索到的前几名文档作为证据,并提示(prompt)给大型语言模型(Large La…...
Android OpenMAX(四)OMX Core
假设我们已经写好了所有的OMX组件,有vdec、venc、adec、aenc,接下来问题来了,我们应该如何管理这些组件呢(创建、销毁)?这一篇文章我们向上一层学习OMX Core提供的标准API。 OMX Core代码位于 OMX_Core.h OMX Core在OpenMAX IL架构中的位置位于IL Client与实际的OMX组件之…...

【Linux】轻量级应用服务器如何开放端口 -- 详解
一、测试端口是否开放 1、测试程序 TCP demo 程序(可参考:【Linux 网络】网络编程套接字 -- 详解-CSDN博客) 2、测试工具 Windows - cmd 窗口 输入命令:telnet [云服务器的公网ip] [port] 二、腾讯云安全组开放端口 1、安全组设…...
git如何查看密码
git查看用户名、邮箱 git config user.name git config user.email 也可以在系统,用户文件夹下面 gitconfig查看 通常无法查看git密码,运行以下命令 git config credential.helper 查看储存的方式,如果是manage 或manage-store则说明是…...
redis脑裂问题
1. 前言 脑裂就是指在主从集群中,同时有两个主节点,它们都能接收写请求。而脑裂最直接的影响,就是客户端不知道应该往哪个主节点写入数据,结果就是不同的客户端会往不同的主节点上写入数据。而且,严重的话,…...

日本率先研发成功6G设备,刺痛了谁?为何日本能率先突破?
日本率先研发成功6G设备,无线数据速率是5G的百倍,这让日本方面兴奋莫名,毕竟日本在科技方面从1990年代以来太缺少突破的创新了,那么日本为何如今在6G技术上能率先突破呢? 日本在1980年代末期达到顶峰,它的科…...

SpringBoot自动配置源码解析+自定义Spring Boot Starter
SpringBootApplication Spring Boot应用标注 SpringBootApplication 注解的类说明该类是Spring Boot 的主配置类,需要运行该类的main方法进行启动 Spring Boot 应用 SpringBootConfiguration 该注解标注表示标注的类是个配置类 EnableAutoConfiguration 直译&#…...
Kafka 环境配置与使用总结
# 部署教程参考 # 官方教程: https://kafka.apache.org/quickstart # 单机部署kafka参考: https://blog.csdn.net/u013416034/article/details/123875299 # 集群部署kafka参考: # https://blog.csdn.net/zhangzjx/article/details/123679453 # https://www.cnblogs.com/And…...

【算法】滑动窗口——串联所有单词的子串
今天来以“滑动窗口”的思想来详解一道比较困难的题目——串联所有单词的子串,有需要借鉴即可。 目录 1.题目2.下面是示例代码3.总结 1.题目 题目链接:LINK 这道题如果把每个字符串看成一个字母,就是另外一道中等难度的题目,即&…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...