PHP电影购票系统点击支付按钮提交表单数据丢失如何解决
问题核心原因
PHP请求是无状态的,你当前逻辑存在两个漏洞导致数据清空:
- 选座、场次、票价计算逻辑仅在首次从选座页跳转到
action.php时,通过读取首次POST参数渲染,没有做持久化存储 - 点击「Go to Payment」按钮触发的是第二次表单POST请求,这次请求不会自动携带首次POST传过来的选座、场次数据,你尝试在这次请求触发时才把数据存入Session,此时首次POST的参数已经被释放,自然读不到有效值,页面渲染就会为空
最小改动修复方案
不需要重构现有代码,3步即可解决:
1. 调整Session存储时机,首次接收选座数据就持久化
把action.php顶部的逻辑调整,不要等点支付按钮才存Session,只要检测到是从选座页传过来的选座、场次参数,立刻计算票价并把全量订单数据存入Session:
<?php session_start(); // 首次接收选座页提交的数据 if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['seats'], $_POST['showtime'])) { // 存储基础选座信息 $_SESSION['order']['showtime'] = $_POST['showtime']; $_SESSION['order']['seats'] = $_POST['seats']; // 在这里直接完成票价计算,结果一并存入Session // 保留你原有的分区定价逻辑:白金区220卢比、黄金区180卢比、白银区100卢比 $_SESSION['order']['price_detail'] = $calculatedPriceList; // 单座票价明细数组 $_SESSION['order']['gst'] = $calculatedGst; // 计算好的GST税费 $_SESSION['order']['total_amount'] = $calculatedTotal; // 计算好的总应付金额 } ?>
2. 页面渲染数据源统一读取Session,表单加隐藏域做双保险
- 渲染场次信息、选座结果、票价明细表格时,统一从
$_SESSION['order']读取数据,不要直接读取首次POST的参数 - 在个人信息表单内新增隐藏域,把订单核心数据输出到表单中,第二次提交时会自动携带这些参数,避免Session异常导致的数据丢失:
<form method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>"> <!-- 原有个人信息表单项保留 --> <div class="form-item"> <label>姓名 *</label> <input type="text" name="username" required> </div> <div class="form-item"> <label>邮箱 *</label> <input type="email" name="email" required> </div> <div class="form-item"> <label>手机号 *</label> <input type="tel" name="phone" required> </div> <!-- 新增订单数据隐藏域 --> <input type="hidden" name="showtime" value="<?php echo $_SESSION['order']['showtime']; ?>"> <input type="hidden" name="seats" value="<?php echo htmlspecialchars(serialize($_SESSION['order']['seats'])); ?>"> <input type="hidden" name="total_amount" value="<?php echo $_SESSION['order']['total_amount']; ?>"> <!-- 原有价格明细表格,数据源替换为$_SESSION['order']内的存储值 --> <table class="price-detail"> <!-- 遍历$_SESSION['order']['price_detail']渲染单座票价行 --> <tr> <td>GST税费</td> <td><?php echo $_SESSION['order']['gst']; ?> 卢比</td> </tr> <tr> <td>总金额</td> <td><?php echo $_SESSION['order']['total_amount']; ?> 卢比</td> </tr> </table> <button type="submit" name="submit_payment">Go to Payment(去支付)</button> </form>
3. 支付按钮提交逻辑调整
检测到用户点击支付按钮的POST请求时,直接从Session中读取预存的订单数据,和用户提交的姓名、邮箱、手机号合并生成完整订单即可,不需要重复计算票价。
避坑提示:不要在点击支付按钮的逻辑里重复计算票价,也不要尝试从第二次POST的参数里反推选座数据,所有订单核心计算逻辑只在首次接收选座参数时执行一次,避免前后金额不一致。
内容的提问来源于stack exchange,提问作者Hello World
相关产品推荐
相关产品推荐

