0

0

PHP教程:利用Session在多次表单提交中累积用户输入数据

DDD

DDD

发布时间:2025-10-09 13:27:18

|

798人浏览过

|

来源于php中文网

原创

PHP教程:利用Session在多次表单提交中累积用户输入数据

本教程旨在解决PHP表单提交中数据无法跨请求持久化的问题。通过详细分析问题根源,即数组在每次请求时被重新初始化,并提供基于PHP Session的解决方案。文章将指导读者如何利用Session超全局变量存储并累积用户提交的多个值,确保数据在页面刷新或多次提交后仍能保留,并提供清晰的代码示例和实现步骤。

1. 理解问题:为什么数据会丢失?

在web开发中,当用户通过html表单提交数据到php脚本时,php脚本会处理这次请求。然而,http协议是无状态的,这意味着每次请求都是独立的,服务器不会“记住”上一次请求的任何信息。

考虑以下场景:用户在表单中输入了“Bob”,提交后,PHP脚本将其添加到数组并显示。当用户再次输入“Tess”并提交时,“Bob”却消失了,只显示“Tess”。这是因为在每次新的请求中,PHP脚本都会从头开始执行。如果我们在脚本中定义一个局部数组并向其中添加数据,这个数组会在每次请求开始时被重新初始化,导致之前添加的数据丢失

我们来看一个典型的错误示例代码:

<h1> 我的最爱艺术家 </h1>

<form method='POST'>
    <h3>请输入您最爱的艺术家</h3>
    <input type="text" name="artist">
    <input type="submit" value="提交艺术家">
</form>

<?php
if (isset($_POST['artist'])) { // 检查是否提交了数据
    $art = $_POST['artist'];
    $artist = array(); // 每次请求都会重新初始化一个空数组
    array_push($artist, $art);

    foreach ($artist as $a) {
        echo "<li>$a</li>";
    }
}
?>

在这段代码中,$artist = array(); 这一行是问题的关键。每次用户提交表单,服务器接收到请求并执行PHP脚本时,$artist 都会被重置为一个空数组,然后只把当前提交的艺术家添加进去。因此,之前提交的艺术家信息就会被覆盖。

2. 解决方案:利用PHP Session实现数据持久化

为了解决HTTP的无状态性问题,我们需要一种机制来在不同请求之间存储用户的数据。PHP Session(会话)就是为此而生。Session允许你在用户的整个访问会话期间,跨多个页面请求存储和访问数据。

立即学习PHP免费学习笔记(深入)”;

当一个Session启动时,PHP会在服务器上创建一个唯一的Session文件或记录,并为用户浏览器发送一个Session ID(通常通过Cookie)。浏览器在后续请求中会带上这个Session ID,PHP服务器就能识别出是同一个用户的请求,并加载对应的Session数据。这些数据存储在$_SESSION 这个超全局数组中。

小微助手
小微助手

微信推出的一款专注于提升桌面效率的助手型AI工具

下载

Session的工作原理:

  1. session_start(): 在任何HTML输出之前调用此函数,它会启动一个新的会话或恢复一个已存在的会话。
  2. $_SESSION 超全局数组: 任何存储到$_SESSION数组的数据都将持久化到会话结束(例如,浏览器关闭或会话超时)。

3. 实现步骤与代码示例

现在,我们将使用PHP Session来改进上述代码,使其能够累积并显示用户提交的多个艺术家。

<?php
session_start(); // 必须在任何HTML输出之前调用
?>

<h1> 我的最爱艺术家 </h1>

<form method='POST'>
    <h3>请输入您最爱的艺术家</h3>
    <input type="text" name="artist">
    <input type="submit" value="提交艺术家">
</form>

<?php
// 检查表单是否提交了艺术家数据
if (isset($_POST['artist']) && !empty(trim($_POST['artist']))) {
    $art = trim($_POST['artist']); // 获取并清理用户输入

    // 检查 $_SESSION['artist'] 是否已存在且是数组,如果不存在则初始化为空数组
    if (!isset($_SESSION['artist']) || !is_array($_SESSION['artist'])) {
        $_SESSION['artist'] = array();
    }

    // 将新的艺术家添加到Session中的数组
    array_push($_SESSION['artist'], $art);
}

// 从Session中获取艺术家列表
$artistList = isset($_SESSION['artist']) ? $_SESSION['artist'] : array();

// 如果艺术家列表不为空,则显示
if (!empty($artistList)) {
    echo "<h3>您已提交的艺术家:</h3>";
    echo "<ul>"; // 使用无序列表显示
    foreach ($artistList as $a) {
        echo "<li>" . htmlspecialchars($a) . "</li>"; // 输出前进行HTML实体转义,防止XSS攻击
    }
    echo "</ul>";
} else {
    echo "<p>当前还没有添加任何艺术家。</p>";
}
?>

代码解析:

  1. session_start();: 这是最关键的一步,它必须放在PHP脚本的最顶部,在任何HTML输出之前。它会启动或恢复一个会话。
  2. if (isset($_POST['artist']) && !empty(trim($_POST['artist']))): 这个条件判断确保只有当表单被提交,并且artist字段有非空值时,我们才处理数据。trim()用于去除用户输入两端的空白字符。
  3. if (!isset($_SESSION['artist']) || !is_array($_SESSION['artist'])): 这是一个健壮的检查。它确保$_SESSION['artist']这个键存在并且是一个数组。如果它不存在或不是数组(例如,会话刚启动或之前存储了其他类型的数据),我们将其初始化为一个空数组。这样可以避免在首次添加数据时出现错误。
  4. array_push($_SESSION['artist'], $art);: 将用户提交的艺术家添加到$_SESSION['artist']数组中。由于$_SESSION是持久化的,这个数组会在不同请求之间保持其状态。
  5. $artistList = isset($_SESSION['artist']) ? $_SESSION['artist'] : array();: 获取当前Session中存储的艺术家列表。如果$_SESSION['artist']不存在,则默认给一个空数组,防止后续循环报错。
  6. if (!empty($artistList)): 在尝试遍历数组之前,先检查数组是否为空,避免显示空的列表标题。
  7. htmlspecialchars($a): 重要安全措施。在将用户输入显示到页面上之前,务必使用htmlspecialchars()函数进行转义,以防止跨站脚本攻击(XSS)。

4. 注意事项与最佳实践

  • session_start() 位置: 必须放在PHP脚本的最开头,在任何<html>、<body>标签或空格输出之前。
  • 输入验证与清理: 始终对用户输入进行验证(例如,检查数据类型、长度)和清理(例如,trim()去除空格,htmlspecialchars()防止XSS)。
  • Session管理:
    • 销毁Session: 当用户退出登录或不再需要Session数据时,应销毁Session以释放服务器资源并提高安全性。可以使用 session_unset();(清除所有Session变量)和 session_destroy();(销毁Session文件)。
    • Session超时: PHP的session.gc_maxlifetime配置项控制Session的生命周期。
  • 用户体验: 可以考虑添加一个“清空列表”按钮,让用户能够手动清空Session中存储的艺术家列表。
  • 数据量: Session适合存储少量用户相关的数据。如果需要存储大量数据或更复杂的数据结构,应考虑使用数据库。

总结

通过本教程,我们学习了如何利用PHP Session解决表单多次提交时数据无法累积的问题。核心思想是使用session_start()启动会话,并将数据存储到$_SESSION超全局数组中,从而实现数据在不同HTTP请求间的持久化。正确使用Session不仅能提升用户体验,也是构建动态、交互式Web应用的重要基石。同时,请务必牢记数据安全和输入验证的重要性,确保应用程序的健壮性和安全性。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

338

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

225

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

138

2026.02.12

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

847

2023.08.22

cookie
cookie

Cookie 是一种在用户计算机上存储小型文本文件的技术,用于在用户与网站进行交互时收集和存储有关用户的信息。当用户访问一个网站时,网站会将一个包含特定信息的 Cookie 文件发送到用户的浏览器,浏览器会将该 Cookie 存储在用户的计算机上。之后,当用户再次访问该网站时,浏览器会向服务器发送 Cookie,服务器可以根据 Cookie 中的信息来识别用户、跟踪用户行为等。

6500

2023.06.30

document.cookie获取不到怎么解决
document.cookie获取不到怎么解决

document.cookie获取不到的解决办法:1、浏览器的隐私设置;2、Same-origin policy;3、HTTPOnly Cookie;4、JavaScript代码错误;5、Cookie不存在或过期等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

368

2023.11.23

阻止所有cookie什么意思
阻止所有cookie什么意思

阻止所有cookie意味着在浏览器中禁止接受和存储网站发送的cookie。阻止所有cookie可能会影响许多网站的使用体验,因为许多网站使用cookie来提供个性化服务、存储用户信息或跟踪用户行为。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

447

2024.02.23

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

97

2025.08.19

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 13.6万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号