PHP会话数组日期差计算及Delete按钮功能异常排查求助
问题:基于日期差的Session条目删除/检索按钮逻辑修复
首先,我先明确下你的核心需求:用户分5次提交4项数据存到Session数组,展示时每条数据对应Retrieve和Delete按钮,规则是:
- 当
inputTime2与inputTime的天数差>2时,允许点击Delete清除对应Session条目 - 当天数差<2时,允许点击Retrieve清除对应Session条目
- 两个按钮最终都清除对应Session,只是触发的日期条件不同
接下来分析你当前代码的问题,然后给出针对性的修复方案:
当前代码的核心问题
1. Box-function.php(Delete按钮逻辑)
这里有几个致命的逻辑错误:
- 外部传入的
$_GET['id']直接覆盖了循环变量$x,导致循环逻辑完全混乱 - 日期差计算的数组赋值写法完全错误(比如
[$date2 - $date1][$x]这种方式根本取不到正确值) - 条件判断
if ($days[$x] == 2 && $days[$x] > 2)永远为false——一个数不可能同时等于2且大于2 - 只清除了3个Session字段,漏了
InputTime2 - 没有针对当前点击的条目处理,反而循环所有5条数据,逻辑完全偏离需求
2. User-display1.php(数据展示与按钮链接)
Delete按钮传递的是$row["id"]而非数组索引$x,后端无法定位到正确的Session条目,自然点击后没反应
3. clear-session.php(Retrieve按钮逻辑)
完全没有添加天数差<2的判断,不管日期差多少点击都会清除Session,不符合需求
针对性修复方案
1. 修复Box-function.php(Delete按钮逻辑)
我们不需要循环所有条目,只处理当前点击的那一条即可,同时修正日期计算和条件判断:
<?php session_start(); // 先验证传入的id是否合法(必须是0-4的整数) if (isset($_GET['id']) && is_numeric($_GET['id']) && $_GET['id'] >= 0 && $_GET['id'] < 5) { $x = (int)$_GET['id']; // 检查当前条目是否存在(避免处理已被清除的空条目) if (!empty($_SESSION['InputTime'][$x]) && !empty($_SESSION['InputTime2'][$x])) { // 计算两个日期的天数差 $date1 = strtotime($_SESSION['InputTime'][$x]); $date2 = strtotime($_SESSION['InputTime2'][$x]); $datediff = $date2 - $date1; $days = round($datediff / (60 * 60 * 24)); // 仅当天数差>2时,清除对应Session的所有字段 if ($days > 2) { $_SESSION['DeliveryBy'][$x] = ''; $_SESSION['ItemNo'][$x] = ''; $_SESSION['InputTime'][$x] = ''; $_SESSION['InputTime2'][$x] = ''; } } } // 跳转回展示页面 header('Location: User-display1.php'); exit; // 跳转后一定要exit,避免后续代码执行 ?>
2. 修复User-display1.php的按钮链接与显示逻辑
在渲染每条数据时,要传递正确的数组索引$x,同时根据日期差控制按钮的显示(只显示符合条件的按钮):
<?php session_start(); ?> <!DOCTYPE html> <html> <body> <h2>已提交的数据</h2> <?php for ($x = 0; $x < 5; $x++) : ?> <?php // 只显示非空的条目 ?> <?php if (!empty($_SESSION['ItemNo'][$x])) : ?> <div class="data-item"> <p><strong>Delivery By:</strong> <?php echo htmlspecialchars($_SESSION['DeliveryBy'][$x]); ?></p> <p><strong>Item No:</strong> <?php echo htmlspecialchars($_SESSION['ItemNo'][$x]); ?></p> <p><strong>Input Time:</strong> <?php echo htmlspecialchars($_SESSION['InputTime'][$x]); ?></p> <p><strong>Input Time 2:</strong> <?php echo htmlspecialchars($_SESSION['InputTime2'][$x]); ?></p> <?php // 计算当前条目的日期差 $date1 = strtotime($_SESSION['InputTime'][$x]); $date2 = strtotime($_SESSION['InputTime2'][$x]); $days = round(($date2 - $date1) / (60 * 60 * 24)); ?> <?php if ($days > 2) : ?> <a href="Box-function.php?id=<?php echo $x; ?>">Delete</a> <?php elseif ($days < 2) : ?> <a href="clear-session.php?id=<?php echo $x; ?>">Retrieve</a> <?php endif; ?> <!-- 天数等于2时,两个按钮都不显示 --> </div> <hr> <?php endif; ?> <?php endfor; ?> </body> </html>
注意:这里添加了htmlspecialchars()来防止XSS攻击,同时控制了按钮的显示逻辑,只有符合条件的按钮才会出现
3. 修复clear-session.php(Retrieve按钮逻辑)
添加天数差<2的判断,确保只有符合条件才清除Session:
<?php session_start(); // 验证传入的id合法性 if (isset($_GET['id']) && is_numeric($_GET['id']) && $_GET['id'] >= 0 && $_GET['id'] < 5) { $x = (int)$_GET['id']; if (!empty($_SESSION['InputTime'][$x]) && !empty($_SESSION['InputTime2'][$x])) { $date1 = strtotime($_SESSION['InputTime'][$x]); $date2 = strtotime($_SESSION['InputTime2'][$x]); $days = round(($date2 - $date1) / (60 * 60 * 24)); // 仅当天数差<2时,清除对应Session条目 if ($days < 2) { $_SESSION['DeliveryBy'][$x] = ''; $_SESSION['ItemNo'][$x] = ''; $_SESSION['InputTime'][$x] = ''; $_SESSION['InputTime2'][$x] = ''; } } } header('Location: User-display1.php'); exit; ?>
内容的提问来源于stack exchange,提问作者Muzu
相关产品推荐
相关产品推荐

