全栈: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表单,添加按钮,点击返回主页

相关推荐
云飞云共享云桌面30 分钟前
8位机械工程师如何共享一台图形工作站算力?
linux·服务器·网络
励志成为嵌入式工程师30 分钟前
c语言简单编程练习9
c语言·开发语言·算法·vim
捕鲸叉1 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer1 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq1 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
记录成长java3 小时前
ServletContext,Cookie,HttpSession的使用
java·开发语言·servlet
前端青山3 小时前
Node.js-增强 API 安全性和性能优化
开发语言·前端·javascript·性能优化·前端框架·node.js
睡觉谁叫~~~3 小时前
一文解秘Rust如何与Java互操作
java·开发语言·后端·rust
音徽编程3 小时前
Rust异步运行时框架tokio保姆级教程
开发语言·网络·rust
观音山保我别报错3 小时前
C语言扫雷小游戏
c语言·开发语言·算法