全栈:session用户会话信息,用户浏览记录实例

PHP中的session是一种存储机制,它允许您存储和跟踪用户在访问Web应用程序时的信息。会话通常用于存储用户特定的数据,如用户ID、购物车内容、用户偏好设置等,这些数据需要在多个页面请求之间保持不变。

session详解

1. 会话是如何工作的

会话通过唯一的会话ID来标识每个用户。这个会话ID可以存储在多种地方:

  • 默认情况下,它存储在cookie中。
  • 也可以存储在服务器的端或URL中。

当用户与Web应用程序交互时,服务器使用这个会话ID来检索和更新存储在服务器端的会话数据。

2. 开启会话

要使用会话,必须首先调用session_start()函数。这个函数初始化会话注册过程,创建会话ID,并存储在cookie中。

session_start();

3. 使用$_SESSION超全局变量

$_SESSION是一个超全局变量,它包含了会话存储的数据。可以通过它来设置、读取或删除会话变量。

// 设置会话变量
$_SESSION['username'] = 'JohnDoe';

// 读取会话变量
echo $_SESSION['username'];

// 删除会话变量
unset($_SESSION['username']);

4.会话配置

在调用session_start()之前,可以使用各种函数来配置会话,例如:

  • session_name():设置会话名称,这是会话ID存储在cookie中的名称。
  • session_module_name():指定使用的会话模块。
  • session_save_path():设置会话数据的保存路径。

5. 会话ID管理

  • 可以通过session_id()获取当前会话ID。
  • 使用session_regenerate_id()可以重新生成一个新的会话ID。

6. 会话结束

当用户完成与Web应用程序的交互时,可能希望结束会话。这可以通过调用session_destroy()函数实现,它将销毁所有的会话数据。

session_destroy();

实例代码内函数简介

 

  1. session_start(): 启动一个新的或恢复一个现有的会话,是使用会话变量的前提。

  2. $_SESSION: 超全局数组,用于存储用户会话数据。如$_SESSION['username']用于存储用户名。

  3. empty(): 检查一个变量是否为空。如果变量未设置,或者其值等同于FALSE,则返回TRUE

  4. isset(): 判断变量是否已经设置且不为NULL。变量存在且有值的情况下返回true,反之(空值,null)为false

  5. basename(__FILE__): 返回路径中的文件名部分,__FILE__是一个魔术常量,代表当前脚本的完整路径和文件名。

  6. array_unshift(): 在数组的开头插入一个或多个元素。

  7. foreach: 遍历数组的每个元素,并执行代码块。

  8. header(): 发送原生的HTTP头信息。常用于重定向(header("Location: ..."))、设置内容类型(header("Content-Type: ..."))等。

用户浏览记录实例

1.编写前端html代码,用于post传递用户名等信息

html源码:08.html

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>Document</title>

</head>

<body>

    <form action="09.php" method="post">

        name:<input type="text" name="uname">

        password: <input type="password" name="passwd">

        <input type="submit" value="log in">

    </form>

</body>

</html>

  • <form> 标签定义了一个表单,用户可以在这个表单中输入数据。action="09.php" 指定了当用户提交表单时,表单数据将被发送到服务器上的 "09.php" 文件进行处理。method="post" 指定了数据发送的方式为POST方法,这通常用于提交敏感信息,如密码,因为它不会在URL中显示数据。

  • name:<input type="text" name="uname"> 创建了一个文本输入框,用户可以在此输入用户名。name="uname" 定义了输入框的名称,这个名称在后端处理表单数据时用来识别这个字段的值。

  • password: <input type="password" name="passwd"> 类似地,创建了一个密码输入框,用户输入的内容会被隐藏显示为星号或圆点,以保护密码不被旁人窥视。name="passwd" 是该输入框的名称,同样用于后端数据处理。

  • <input type="submit" value="log in"> 创建了一个提交按钮,用户点击此按钮后,表单数据就会被提交。value="log in" 定义了按钮上显示的文字为 "log in"。

2.后端编写用户名,密码登录验证

php源码:09.php

<?php

    session_start();

   

    if(!(empty($_POST['uname']) && empty($_POST['passwd']))){

 

        if($_POST['uname'] == "zhangsan" && $_POST['passwd'] == 123456){

           

            $_SESSION['username'] = $_POST['uname'];

 

            if (!(isset($_SESSION['history']))){

                $_SESSION['history'] = [];

                array_unshift($_SESSION['history'],basename(__FILE__));

            }

           

            echo '<a href="06.php" target="_blank" >access:log in</a>';

            //var_dump($_SESSION);

 

        }else{

            echo '<script>alert("Invalid username or password")</script>';

        }

 

    }else{

        echo '<script>alert("The user name and password are empty")</script>';

    }

 

?>

  • session_start(); 启动了会话管理,允许在多个页面间传递数据,比如用户的登录状态。

  • if(!(empty($_POST['uname']) && empty($_POST['passwd']))){} 检查是否同时提交了用户名(uname)和密码(passwd),如果两者都不为空,则继续执行内部代码。

  • 接下来的条件 if($_POST['uname'] == "zhangsan" && $_POST['passwd'] == 123456){} 验证用户输入的用户名和密码是否与预设的凭证匹配(这里仅为示例,实际应用中不应硬编码凭证)。如果是,执行以下操作:

    • $_SESSION['username'] = $_POST['uname']; 将用户名存储在会话变量中,表示用户已成功登录。

    • 代码检查是否存在一个名为'history'的会话变量。如果不存在,初始化为空数组,并将当前脚本文件名(通过basename(__FILE__)获得)添加到数组的开头作为用户登录的历史记录。

  • 如果登录成功,页面会显示一个链接指向"06.php"页面,用户可以点击访问。否则,通过JavaScript弹出警告提示用户“Invalid username or password”。

  • 如果用户名或密码任一为空,将弹出警告提示“用户名和密码为空”。

3.编写主页,用于跳转至其他界面

php源码:06.php

<?php    

    header("content-type:text/html;charset=utf8");

    session_start();

    if(!(empty($_SESSION['username']))){

        echo '欢迎用户:' . $_SESSION['username'];

        array_unshift($_SESSION['history'],basename(__FILE__));

    }else{

        echo "<script >";

        echo "alert('未登录,即将重定向');";

        echo "window.location.href='08.html';";

        echo "</script>";

       

    }

    // echo '<a href="10.php">点击清除登录信息</a>';

    echo'<form action="10.php" method="get">';

    echo'<button type="submit">点击清除登录信息</button>';

    echo'</form>';

 

    echo'<form action="11.php" method="get">';

    echo'<button type="submit">浏览历史</button>';

    echo'</form>';

    //var_dump ($_SESSION);

   

?>

  • header("content-type:text/html;charset=utf8"); 设置响应内容类型为HTML,并指定字符集为UTF-8,确保中文等多字节字符能够正确显示。

  • session_start(); 启动会话,这是处理会话数据前的必要步骤。

  • if(!(empty($_SESSION['username']))){} 检查会话中是否存在名为username的变量,即判断用户是否已经登录。如果用户已登录:

    • 输出欢迎信息,包含用户名。
    • 更新用户的历史记录(访问过的页面列表),将当前脚本文件名(通过basename(__FILE__)获取)添加到历史记录数组的最前面。
  • 如果用户未登录,则通过JavaScript弹出警告框提示“未登录,即将重定向”,并重定向到"08.html",这是一个通常用于登录页面的重定向操作。

  • 提供了两个按钮形式的表单,分别用于:

    • 清除登录信息,通过GET请求发送到"10.php"。这通常是一个登出功能,用于销毁会话数据。
    • 查看浏览历史,通过GET请求发送到"11.php"。预计这个页面会展示之前存储在会话变量'history'中的用户访问历史。
  • 注释掉的// var_dump ($_SESSION); 用来调试,查看整个会话变量的内容。

4.用户登出,清除会话信息

php源码:10.php

<?php

    session_start();

 

    session_destroy();

   

    header("Location: 08.html");

?>

  1. session_start(): 这个函数启动一个新的或恢复一个现有的会话。在执行任何与会话相关的操作之前,调用它是必要的。

  2. session_destroy(): 这个函数用来销毁当前用户的会话。它会清除与当前会话相关的所有数据,包括会话变量等。当你希望用户注销并结束他们的会话时,这是一个关键的操作,以确保安全和隐私。

  3. header("Location: 08.html"): 此行代码发送一个HTTP头信息给浏览器,指示浏览器重定向到指定的URL——在这个例子中是"08.html"。通常,这用于在用户注销后将他们重定向回登录页面或其他默认页面,以避免用户在注销后仍然停留在具有权限要求的页面上。

代码作用:

  • 先确保会话已经启动。
  • 销毁当前用户的会话,清除所有会话数据,实现用户登出。
  • 通过HTTP重定向将用户送回到登录页面("08.html"),完成整个注销流程。

<1>查看保存的session信息

路径:phpStudy\tmp\tmp

 

5.输出用户历史浏览信息

php源码:11.php

    session_start();

    //var_dump($_SESSION);

    array_unshift($_SESSION['history'],basename(__FILE__));

    foreach($_SESSION['history'] as $k=>$v){

        echo $v . '<hr><br>';

    }

    echo'<form action="06.php" method= "get">';

    echo'<button type="submit">dianji</button>;';

    echo'</form>';

 

  1. session_start();: 启动或恢复一个会话。这是访问会话变量之前必须执行的操作。

  2. **array_unshift(_SESSION['history'], basename(__FILE__));**: 这行代码将当前脚本的文件名(通过`basename(__FILE__)`获取)添加到`_SESSION['history']数组的开头。这意味着每次此脚本运行时,都会记录下这次访问。array_unshift`函数用于在数组开头插入元素。

  3. foreach(𝑆𝐸𝑆𝑆𝐼𝑂𝑁[′ℎ𝑖𝑠𝑡𝑜𝑟𝑦′]𝑎𝑠S​ESSION[′history′]ask=>𝑣):使用foreach循环遍历‘_SESSION['history']`数组中的每个元素。对于数组中的每一项(每个浏览历史记录),它将执行循环体内的代码。

  4. echo $v . '<hr><br>';: 在循环内部,这行代码输出当前的历史记录条目(文件名),并跟随着一个水平分割线<hr>和一个换行<br>,以便在网页上清晰地分隔每个历史记录。

  5. echo'<form action="06.php" method= "get">';

    echo'<button type="submit">dianji</button>;';

    echo'</form>';

    拼接form表单,添加按钮,点击返回主页

 

 

 

 

 

 

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

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

相关文章

西门子S7-1200加入MRP 环网用法

MRP&#xff08;介质冗余&#xff09;功能概述 SIMATIC 设备采用标准的冗余机制为 MRP&#xff08;介质冗余协议&#xff09;&#xff0c;符合 IEC62439-2 标准&#xff0c;典型重新组态时间为 200ms&#xff0c;每个环网最多支持 50个设备。​博途TIA/WINCC社区VX群 ​博途T…

Linux 批量网络远程PXE

一、搭建PXE远程安装服务器 1、yum -y install tftp-server xinetd #安装tftp服务 2、修改vim /etc/xinetd.d/tftpTFTP服务的配置文件 systemctl start tftp systemctl start xinetd 3、yum -y install dhcp #---安装服务 cp /usr/share/doc/dhc…

c 语言 ---- 结构体

什么是结构体 自定义的数据类型 结构体的声明定义 //1.先声明再定义 struct point{int x;int y; };struct point p1,p2;//2.声明的同时定义 struct point{int x;int y; }p1,p2;typedef定义别名 关键字typedef用于为系统固有的或者程序员自定义的数据类型定义一个别名。数据类…

利用Python队列生产者消费者模式构建高效爬虫

目录 一、引言 二、生产者消费者模式概述 三、Python中的队列实现 四、生产者消费者模式在爬虫中的应用 五、实例分析 生产者类&#xff08;Producer&#xff09; 消费者类&#xff08;Consumer&#xff09; 主程序 六、总结 一、引言 随着互联网的发展&#xff0c;信…

Bug:Linux用户拥有r权限但无法打开文件【Linux权限体系】

Bug&#xff1a;Linux用户拥有r权限但无法打开文件【Linux权限体系】 0 问题描述&解决 问题描述&#xff1a; 通过go编写了一个程序&#xff0c;产生的/var/log/xx日志文件发现普通用户无权限打开 - 查看文件权限发现该文件所有者、所有者组、其他用户均有r权限 - 查看该日…

5个好用的AI写论文网站推荐

目录 1.AIQuora论文写作 2.passyyds 答辩PPT 3.AIPassgo论文降AIGC 4.文状元 5.passyyds论文写作 毕业论文是每个毕业生的痛&#xff0c;不管你是本科还是硕士要想顺利毕业你就不得不面对论文。然而&#xff0c;面对论文写作时常常感到无从下手&#xff1a;有时缺乏灵感&a…

ajax应用

在互联网的浩瀚海洋中&#xff0c;信息如同潮水般涌动。对于数据分析师、研究人员或是任何想要从网络上获取信息的人来说&#xff0c;掌握Ajax数据抓取技术无疑是一把开启宝藏的钥匙。Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;不仅让网页交互变得更加流畅&…

【JavaEE进阶】——要想代码不写死,必须得有spring配置(properties和yml配置文件)

目录 本章目标&#xff1a; &#x1f6a9;配置文件 &#x1f6a9;SpringBoot配置文件 &#x1f388;配置⽂件的格式 &#x1f388; properties 配置⽂件说明 &#x1f4dd;properties语法格式 &#x1f4dd;读取配置文件 &#x1f4dd;properties 缺点分析 &#x1f3…

中国科技期刊卓越行动计划重点期刊

https://kyc.webs.nbpt.edu.cn/_upload/article/files/3e/82/8a3a267048079f3487aef8802af8/09b9fa10-af17-4c2c-89ab-aa0facfb107c.pdf

记录下面试(240522)

试问面试有多难&#xff0c;看看今天的面试题。 1、kong都用了哪些插件&#xff1f; 2、zk底层一致性协议是什么&#xff0c;源码级别的理解。 3、mysql mvcc 引擎&#xff0c;索引都怎么实现的。 4、es底层全文索引如何实现的。 4、业务整体架构是什么样的&#xff0c; 5、如何…

操作MySQL数据库

【一】针对库的增删查改&#xff08;文件夹&#xff09; 【1】创建数据库 &#xff08;1&#xff09;语法 创建一个存储数据表的文件夹。 注意&#xff1a;mysql中的编码字符集中utf-8&#xff0c;要换成utf8mb4。SQL语句中的中括号部分表示可选。 create database [if no…

修改uniapp内置组件checkbox的样式

默认情况下 <view style"margin-bottom: 20rpx;"><label style"display: flex;align-items: center;width: fit-content;" click"handleCheck(cxm4s)"><checkbox /><text>车信盟出险4S维保</text></label>…

Java实验08

实验一 demo.java package q8.demo02;public class demo{public static void main(String[] args) {WindowMenu win new WindowMenu("Hello World",20,30,600,290);} }WindowMenu.java package q8.demo02; import javax.swing.*;public class WindowMenu extends…

数据结构初始化链表

链表是一种常见的数据结构&#xff0c;可以用于存储一系列的元素&#xff0c;每个元素包含一个值和一个指向下一个元素的指针。 链表的初始化可以通过创建一个头结点来实现&#xff0c;头结点不存储任何元素&#xff0c;只作为链表的起始点。在初始化时&#xff0c;可以将头结…

3d火灾救援模拟仿真培训软件复用性强

消防VR安全逃生体验系统是深圳VR公司华锐视点引入了前沿的VR虚拟现实、web3d开发和多媒体交互技术&#xff0c;为用户打造了一个逼真的火灾现场应急逃生模拟演练环境。 相比传统的消防逃生模拟演练&#xff0c;消防VR安全逃生体验系统包含知识讲解和模拟实训演练&#xff0c;体…

el-table树型数据lazy加载实现首行展开

el-table树型数据lazy加载实现首行展开 遇到一个小需求&#xff0c;一个树型数据的el-table&#xff0c;并且使用lazy加载&#xff0c;需要实现首行展开。 实现 思路&#xff1a;使用 expand-row-keys 或者 toggleRowExpansion API展开&#xff0c;但是发现这些API并不会触发…

【百度智能体】5分钟打造一款为你写情书的智能体

目录 前言一、智能体特点二、应用场景三、打造一款写情书智能体1、名称2、简介3、填写人物设定&#xff1a;4、开场白5、引导示例6、预览 最后 前言 智能体作为人工智能领域的一个重要概念&#xff0c;是指能够自主感知环境、做出决策并执行行动的系统。它具备自主性、交互性、…

程序员经常去的网站

程序员们经常去的网站确实非常多样化&#xff0c;这些网站不仅提供了丰富的技术资源和学习材料&#xff0c;还是他们交流经验和分享知识的重要平台。以下是一些程序员经常访问的网站&#xff0c;我将按照不同的类别进行归纳和分点表示&#xff1a; 一、代码托管与协作 GitHub&a…

单元测试(了解)

单元测试定义 针对最小功能单元&#xff08;方法&#xff09;&#xff0c;编写测试代码对其进行正确性测试 之前如何进行单元测试&#xff1f;有什么问题&#xff1f; main中编写测试代码&#xff0c;调用方法测试 问题&#xff1a; 无法自动化测试 每个方法的测试可能不是…

EPSON爱普生RTC RA8900CE/RA8000CE+松下Panasonic电池组合

RTC是一种实时时钟&#xff0c;用于记录和跟踪时间&#xff0c;具有独立供电和时钟功能。在某些应用场景中&#xff0c;为了保证RTC在断电或者其他异常情况下依然能够正常工作&#xff0c;需要备份电池方案来提供稳定的供电。本文将介绍EPSON爱普生RTC RA8900CE/RA8000CE松下Pa…