
本文介绍如何使用 php session 机制替代临时数组,使用户每次提交的任务都能被累积保存并显示,解决仅显示最后一个任务的问题。
本文介绍如何使用 php session 机制替代临时数组,使用户每次提交的任务都能被累积保存并显示,解决仅显示最后一个任务的问题。
在原始代码中,$tasks 被定义为一个每次请求都重新初始化的局部数组,其生命周期仅限于当前脚本执行过程。因此,即使用户多次提交不同任务,每次刷新或跳转后 $tasks 都会被重置,最终只保留最后一次通过 $_GET 接收的数据 —— 这正是“只显示最后一个任务”的根本原因。
要实现任务的持续累积,必须将数据跨请求持久化存储。虽然数据库是最规范、可扩展的方案,但在快速原型或轻量需求下,PHP 的 $_SESSION 是更简洁可靠的替代选择:它基于服务端会话机制,安全、无需额外配置,且天然支持数组追加操作。
✅ 正确做法:使用 Session 累积任务
首先,在文件顶部(任何输出前)调用 session_start() 启动会话:
<?php session_start(); // 必须放在最前面,且不能有任何 HTML 或空格输出
接着,将任务添加逻辑改为向 $_SESSION['tasks'] 数组追加元素(注意使用 [] 语法自动推入):
立即学习“PHP免费学习笔记(深入)”;
if (isset($_GET['task_name'], $_GET['day'], $_GET['month'], $_GET['year'])) {
$task_name = htmlspecialchars($_GET['task_name']); // 防止 XSS
$day = (int)$_GET['day'];
$month = (int)$_GET['month'];
$year = (int)$_GET['year'];
$_SESSION['tasks'][] = [
'name' => $task_name,
'day' => $day,
'month' => $month,
'year' => $year
];
}? 关键点说明:
$_SESSION['tasks'][] = [...]表示向会话中的tasks数组末尾追加一项,而非覆盖;- 使用
htmlspecialchars()对用户输入做基础转义,避免 HTML 注入风险;- 强制类型转换
(int)提升日期参数安全性,防止非法值干扰。
最后,在渲染任务列表时,直接遍历 $_SESSION['tasks'](需先判断是否存在):
echo "<h2>Tasks</h2>";
echo "<table><tr><th>Task Name</th><th>Date</th></tr>";
if (!empty($_SESSION['tasks'])) {
foreach ($_SESSION['tasks'] as $task) {
echo "<tr>";
echo "<td>" . htmlspecialchars($task['name']) . "</td>";
echo "<td>{$task['day']}/{$task['month']}/{$task['year']}</td>";
echo "</tr>";
}
} else {
echo "<tr><td colspan='2'>No tasks added yet.</td></tr>";
}
echo "</table>";⚠️ 注意事项与建议
- Session 依赖 Cookie:确保客户端浏览器启用 Cookie,否则会话 ID 无法传递;
-
会话有效期:默认由
session.gc_maxlifetime控制(通常 1440 秒),长时间未操作可能丢失数据。如需长期保存,请考虑数据库 + 用户登录体系; - 避免重复提交:当前逻辑未防重复提交(例如刷新页面会重复添加)。生产环境应结合 POST/Redirect/GET(PRG)模式或一次性 token;
-
清除任务功能(可选增强):
if (isset($_GET['clear_tasks'])) { unset($_SESSION['tasks']); header('Location: index.php?month=' . $month . '&year=' . $year); exit; }并在页面添加清除链接:
<a href="index.php?clear_tasks=1">Clear all tasks</a>。
通过以上改造,任务数据即可在用户会话期间稳定累积、正确显示,为后续升级至数据库存储打下清晰基础。



















