如何通过表单将用户输入添加至数组且保留已有数据?
解决多次提交表单数据并保留历史记录的问题
嘿,我明白你的困扰了——现在每次提交表单只会显示最新的那一条数据,之前的都没保存下来对吧?这是因为你当前只在每次请求时读取了新的$_POST数据,但没有把历史数据持久化存储起来。咱们用PHP的会话(Session)就能搞定这个问题,它可以帮我们在多次请求之间保存数据。
下面是具体的实现步骤和修改后的代码:
核心思路
我们需要用$_SESSION数组来存储每次提交的项目名称和描述:
- 每次页面加载时先启动会话,这样才能访问和修改会话数据
- 当表单提交时,把新的输入数据追加到会话里的对应数组中
- 展示数据时,从会话数组里读取所有历史记录
修改后的完整代码
首先,在页面的最顶部(任何输出之前)添加会话启动代码,然后处理表单提交逻辑:
<?php // 启动会话,必须放在所有HTML输出之前 session_start(); // 初始化会话中的数组(如果还不存在) if (!isset($_SESSION['project_names'])) { $_SESSION['project_names'] = []; } if (!isset($_SESSION['project_descs'])) { $_SESSION['project_descs'] = []; } // 处理表单提交 if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 获取本次提交的名称和描述(注意表单name是数组形式,取第一个元素) $new_name = $_POST['project_name'][0] ?? ''; $new_desc = $_POST['project_desc'][0] ?? ''; // 只在输入不为空时添加到数组 if (!empty($new_name) && !empty($new_desc)) { $_SESSION['project_names'][] = $new_name; $_SESSION['project_descs'][] = $new_desc; } } ?>
然后是你的HTML表单和数据展示部分:
<form method="post" action=""> <div class="row form-group"> <div class="col-md-12"> <label class="sr-only" for="name">Project Name</label> <input type="text" name="project_name[]" id="name" class="form-control" placeholder="Project Name"> </div> </div> <div class="row form-group"> <div class="col-md-12"> <label class="sr-only" for="desc">Project Description</label> <input type="text" name="project_desc[]" id="desc" class="form-control" placeholder="Project Description"> </div> </div> <div class="form-group"> <input type="submit" value="Submit"> </div> </form> <h2>Submitted Projects</h2> <?php if (!empty($_SESSION['project_names'])): ?> <ul> <?php foreach ($_SESSION['project_names'] as $key => $name): ?> <li> <strong>Project Name:</strong> <?= htmlspecialchars($name) ?><br> <strong>Description:</strong> <?= htmlspecialchars($_SESSION['project_descs'][$key]) ?> </li> <?php endforeach; ?> </ul> <?php else: ?> <p>No projects submitted yet.</p> <?php endif; ?>
关键细节说明
- 会话启动:
session_start()必须放在任何HTML输出之前,否则会报错,它会帮我们创建或恢复当前用户的会话数据。 - 数组初始化:我们先检查会话里的数组是否存在,如果不存在就初始化为空数组,避免第一次访问时出现未定义变量的错误。
- 表单数据处理:因为你的表单input的name是
project_name[],所以$_POST['project_name']是一个数组,我们取第一个元素([0])作为本次提交的名称。另外用?? ''来处理用户没输入的情况,避免报错。 - 安全输出:用
htmlspecialchars()来转义输出的内容,防止XSS攻击,这是一个好习惯哦。 - 空输入过滤:添加了非空判断,避免用户提交空表单时添加空数据到数组里。
这样修改后,每次用户提交表单,新的数据都会追加到会话数组里,之前的历史数据也会保留,刷新页面或者再次提交都不会丢失啦!
内容的提问来源于stack exchange,提问作者user7332667
相关产品推荐
相关产品推荐

