PHP简单登录系统

news2025/1/18 6:51:12

目录

用户数据文件 (users.php)

HTML 登录表单 (login.html)

 PHP 登录处理脚本 (login_process.php)

欢迎页面 (welcome.php)

注销脚本 (logout.php)

效果展示

用户名和密码错误时 

用户名和密码正确时


用户数据文件 (users.php)

用于保存用户信息,用户名和他对应的密码。

<?php
// users.php
return [
    'users' => [
        ['username' => 'Yanqing', 'password' => '无敌剑士123'],
        ['username' => 'JingYuan', 'password' => '实名上网'],
        ['username' => 'Guinaifen', 'password' => '小桂子Guinevere']
    ]
];
?>

return:返回一个数组。

数组中的键 'users' 对应一个包含多个用户信息的数组。

每个用户信息也是一个数组,包含 username 和 password 键。

这里相当于一个二维数组:

usernameYanqingJingYuanGuinaifen
password无敌剑士123实名上网小桂子Guinevere

HTML 登录表单 (login.html)

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>登录系统</title>
</head>
<body>
    <h2>登录</h2>
    <form action="login_process.php" method="post">
        <label for="username">用户名:</label>
        <input type="text" id="username" name="username" required>
        
        <label for="password">密码:</label>
        <input type="password" id="password" name="password" required>
        
        <input type="submit" value="登录">
    </form>
</body>
</html>

lang="zh-CN"告诉浏览器和搜索引擎此页面主要使用的语言是简体中文。

<meta charset="UTF-8"> 这段代码指定了文档的字符编码为UTF-8。

<form>:定义了一个表单,用户可以在此输入数据。

<label>:这是一个标签元素,用于为表单中的输入字段提供描述性的标签。

for="username":这是一个属性,用来关联标签与具体的表单控件。属性值(这里是"username")应该与控件的id属性相匹配。

action="login_process.php":表单提交时的数据将发送到 login_process.php 文件。

method="post":数据将以POST方式发送。

<input>:定义了两个输入字段,一个是用户名,一个是密码。

required:这两个字段必须填写。

<input type="submit">:定义了一个提交按钮,用户点击后将提交表单到login_process.php 文件。

 PHP 登录处理脚本 (login_process.php)

<?php
require_once 'users.php';

// 初始化变量和错误信息
$usernameErr = $passwordErr = "";
$username = $password = "";

// 检查是否为POST请求
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    // 获取表单数据
    $username = test_input($_POST["username"]);
    $password = test_input($_POST["password"]);

    // 加载用户数据
    $users = include 'users.php';

    // 初始化登录标志
    $loginSuccess = false;

    // 遍历用户数据,查找匹配的用户名和密码
    foreach ($users['users'] as $user) {
        if ($user['username'] === $username && $user['password'] === $password) {
            $loginSuccess = true;
            break;
        }
    }

    // 检查登录是否成功
    if ($loginSuccess) {
        // 登录成功,重定向到欢迎页面
        session_start();
        $_SESSION['loggedin'] = true;
        $_SESSION['username'] = $username;
        header("location: welcome.php");
        exit;
    } else {
        // 登录失败,显示错误信息
        $usernameErr = "用户名或密码错误";
    }
}

// 清理数据
function test_input($data) {
    $data = trim($data);
    $data = stripslashes($data);
    $data = htmlspecialchars($data);
    return $data;
}
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>登录失败</title>
</head>
<body>
    <h2>登录失败</h2>
    <p><?php echo $usernameErr; ?></p>
    <a href="login.html">返回登录页面</a>
</body>
</html>

require_once 'users.php';:引入用户数据文件。

if ($_SERVER["REQUEST_METHOD"] == "POST") { ... }:检查是否为POST请求。

test_input():用于清理输入数据,防止XSS攻击。

遍历用户数据,检查输入的用户名和密码是否匹配。

        如果登录成功,session_start()函数开始一个新的会话或者重新启动一个已存在的会话。设置一个名为loggedin的会话变量,并将其值设置为true,表明用户已经成功登录。设置了另一个会话变量username,其值为用户登录时提供的用户名$usernameheader()函数用于发送原始HTTP头,这里发送一个重定向到welcome.php页面的响应头。

如果登录失败,显示错误信息,并提供链接返回登录页面。

欢迎页面 (welcome.php)

<?php
session_start();
if (!isset($_SESSION['loggedin']) || $_SESSION['loggedin'] !== true) {
    header("location: login.html");
    exit;
}
?>

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>欢迎</title>
</head>
<body>
    <h2>欢迎,<?php echo htmlspecialchars($_SESSION['username']); ?>!</h2>
    <p>您已经成功登录。</p>
    <a href="logout.php">注销</a>
</body>
</html>

session_start();:启动会话。

if (!isset($_SESSION['loggedin']) || $_SESSION['loggedin'] !== true) 检查是否存在$_SESSION['loggedin']并且它的值是否为true。如果没有设置或不是true,则认为用户未登录。

header("location: login.html"); 如果用户未登录,则发送一个HTTP头部信息,重定向用户到登录页面login.html

检查是否已登录,如果没有,则重定向到登录页面。

<?php echo htmlspecialchars($_SESSION['username']); ?> 输出会话中存储的用户名,同时使用htmlspecialchars函数防止XSS攻击。

显示用户名,并提供注销链接。

注销脚本 (logout.php)

<?php
session_start();
// 销毁会话
$_SESSION = array();
if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
}
session_destroy();

header("location: login.html");
exit;
?>
session_start();

这行代码开始一个新的会话或者恢复一个已经存在的会话。

$_SESSION = array();

 这一行代码将$_SESSION超全局数组清空,即将其中的所有会话变量设置为空数组。这是注销过程的第一步,确保会话中的所有数据都被清除。

if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
}

这部分代码用于删除与会话相关的Cookie。如果配置了使用Cookies来维持会话(session.use_cookiestrue),则执行以下操作:

使用session_get_cookie_params()获取当前会话Cookie的参数。

使用setcookie()函数创建一个过期的Cookie,其名称与会话名称相同,有效期设置为过去的某个时间点(time() - 42000),这实际上是在删除该Cookie。

session_name()返回会话的名称。

$params["path"]$params["domain"]$params["secure"]$params["httponly"]分别设置Cookie的有效路径、域名、是否只在安全连接下发送以及是否只通过HTTP协议发送。

 

session_destroy();

这行代码彻底销毁会话数据。session_destroy()函数会删除服务器端与会话相关的文件或数据库记录,但不会删除客户端的Cookie(这就是为什么前面需要使用setcookie()来删除Cookie)。

header("location: login.html");
exit;
?>

这部分代码用于重定向用户到登录页面,并结束脚本的执行:

  • header("location: login.html")发送一个HTTP头来重定向用户到login.html页面。
  • exit;确保在发送了重定向头之后立即停止脚本的执行,防止后续代码干扰重定向操作。

效果展示

 

用户名和密码错误时 

 

用户名和密码正确时

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2214331.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【PUSCH的时域资源分配】

DCI format 0_0/0_1用于调度PDSCH传输&#xff0c;每种格式都包含了时域和频域资源的分配字段。 和PDSCH一样&#xff0c;PUSCH也支持Type A和Type B两种映射类型&#xff0c;但是有效的S和L组合不同。 同样&#xff0c;当UE通过DCI调度PUSCH时&#xff0c;DCI的时域资源分配…

日语学习柯桥外语培训jlpt备考「意地」是什么意思?

「意地」 N1单词 意地&#xff08;いじ&#xff09; 词性&#xff1a;名词 含义&#xff1a;心术&#xff0c;用心&#xff1b;固执&#xff0c;倔强&#xff1b;志气&#xff0c;气魄&#xff1b;嘴馋&#xff0c;贪婪 例句&#xff1a; ▲自分が始めたことだから意地でもや…

长三角智驾花絮

杜轩第一次去说服清洁工&#xff0c;收养狗儿&#xff0c;结果清洁工说有人收养了狗&#xff0c;结果狗引起交通事故主人赔钱。第二次尝试说服大妈收养狗儿&#xff0c;大妈给狗儿一脚&#xff0c;说狗儿把她厕所搞脏了。第三次看路上的美女&#xff0c;去说服美女收养&#xf…

UE5运行时动态加载场景角色动画任意搭配-全流程代码(四)

UE5运行时动态加载场景、角色、角色动画、相机动画任意搭配,Android、iOS也可以跑,横竖屏兼容,手机竖屏: 1、场景切换UWorld处理 在通过OpenLevel进行场景切换的时候,UWorld会发生变化,需要我们获取正确的UWorld。 1、在GameInstance监听Level加载 void UMyGameInsta…

nemo-guardrails简单应用

环境&#xff1a;openEuler、python 3.11.6、nemoguardrails 0.10.1、Azure openAi 背景&#xff1a;工作需要&#xff0c;进行调研期间&#xff0c;发现问题太多&#xff0c;且国内网站好多没说明具体问题 时间&#xff1a;20241014 说明&#xff1a;搭建过程中主要是下载h…

ARMA3 STATUS_ACCESS _VIOLATION退出解决方法测试

方法1 [SOLVED] 0xc0000005 status_access_violation ARMA 3 (youtube.com) 启动器-参数-平台 改32位。 没卵用。 方法2 ArmA 3 "STATUS_ACCESS_VIOLATION" FIX!! [2018] (youtube.com) steam-ARMA3-属性-通用-启动选项&#xff1a;粘贴路径&#xff0c;后面加-…

基于FPGA的以太网设计(三)

通过前文介绍了RGMII接口时序我们可以知道&#xff0c;RGMII接口是在时钟信号的上升沿和下降沿均进行数据的传输&#xff0c;而FPGA则在时钟的单沿传输数据&#xff0c;因此我们需要编写代码将RGMII接口转换为GMII接口。 由于前面的介绍我们知道RTL8211默认工作在延时状态&…

体能攻略梳理

最近在锻炼身体&#xff0c;但如何才能更好的锻炼&#xff1f;最近看了慕课上的体能攻略&#xff08;https://www.icourse163.org/learn/HZIC-1206696841&#xff09;&#xff0c;讲的特别好。希望大家看了就是会了&#xff0c;看了就是做了&#x1f601;。 基本知识 减脂别只…

数据库常见面试

8道面试题 目录 目录 7道面试题 1.怎样进行sql优化 4、group by优化 5、limit优化 6、count优化 7、update优化 2.。怎样查看sql执行情况呢(哪个关键字)&#xff0c;说说你对这个关键字的认识 4) possible_key&#xff1a; 5) key 3.说说你对innodb和 myisam的理解 …

pdf阅读器哪个好用?5个软件帮助你快速阅读pdf文件

pdf阅读器哪个好用&#xff1f;5个软件帮助你快速阅读pdf文件 如果你在寻找好用的 PDF 阅读器&#xff0c;有很多强大的软件可以帮助你轻松、高效地阅读和处理 PDF 文件。这些软件不仅可以简单地查看文件&#xff0c;还能提供标注、评论、注释和文档管理等额外功能。以下是5款…

请确保已在git上配置你的user.name和user.email

问题&#xff1a;使用vscode在远程服务器上暂存修改报错&#xff1a; 原因&#xff1a;未在远程服务器上配置该项目对应的git的username和useremail 解决方法&#xff1a; 在vscode中新建一个终端 命名&#xff1a; git config --global user.email "youexample.com&qu…

Linux集群化软件安装,前置

1.准备多个虚拟机 可以选择克隆方式,更快捷 2.配置各个主机IP地址 命令 ; vim /etc/sysconfig/network-scripts/ifcfg-ens33 进入这个文件,操作请看我的文章Linux更改固定IP地址https://blog.csdn.net/m0_72898512/article/details/142718753?spm1001.2014.3001.5501 各个主…

个人博客搭建 | Hexo框架

文章目录 1.Hexo安装2.创建博客3.将博客通过GitHub来部署4.更换主题 1.Hexo安装 Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown&#xff08;或其他标记语言&#xff09;解析文章&#xff0c;在几秒内&#xff0c;即可利用靓丽的主题生成静态网页。搭建Hexo首先要…

采购管理系统有哪些功能?

对于制造型企业来说&#xff0c;采购成本占据重要位置&#xff0c;直接影响企业利润空间&#xff0c;低采购成本可提升企业竞争力&#xff0c;高采购成本则可能压缩企业生存发展空间。一款好用的采购管理系统可以帮助企业解决降低成本的难题&#xff0c;那么采购管理系统有哪些…

如何轻松上手低代码和零代码平台进行应用开发?

在当今数字化转型加速的时代背景下&#xff0c;企业与个人对于快速开发高效的应用程序的需求日益增长。低代码&#xff08;Low Code&#xff09;和零代码&#xff08;No Code&#xff09;平台应运而生&#xff0c;为用户提供了无需深入了解编程语言&#xff0c;即可创建复杂业务…

javaweb-xml映射文件编写sql语句

可以使用注解的方式&#xff0c;也可以使用xml映射的方式&#xff0c;一般简单sql语句使用注解&#xff0c;复杂的使用xml映射。

上厕所也要看的 一篇博客学会线程 进程 并行 并发 Thread Runnable等

线程相关概念 程序 为完成特点的任务&#xff0c;用某种语言编写的一组指令的集合&#xff0c;简单来说就是我们的代码 进程 定义&#xff1a;进程是指运行中的程序&#xff0c;比如我们使用QQ,就启动了一个进程&#xff0c;操作系统就会为该进程分配内存空间&#xff0c;当我…

Idea中,resources下面建文件夹踩坑

Idea中&#xff0c;resources下面建文件夹踩坑 直接上问题 mybatis无法加载xml&#xff0c;别划走&#xff0c;这个无法加载可不是配置写错了&#xff0c;继续看&#xff01; 首先看上图中的xml&#xff0c;可以确定的是项目中所有的配置都是正确的&#xff0c;但是运行mappe…

Apache Kafka各Api模块说明

Kafka API 微信公众号&#xff1a;阿俊的学习记录空间小红书&#xff1a;ArnoZhangwordpress&#xff1a;arnozhang1994博客园&#xff1a;arnozhangCSDN&#xff1a;ArnoZhang1994 Kafka 包含五个核心 API&#xff1a; Producer API 允许应用程序将数据流发送到 Kafka 集群中…

在java 中如何实现执行linux命令,通过post接口代理出来?

接口方式输入命令得返回结果 public AjaxResult doPost(HttpServletRequest request, HttpServletResponse response, String command) throws ServletException, IOException {// 设置响应内容类型 text/plain // response.setContentType("application/json"…