
本文讲解如何使用php session机制保存并持续更新一个数值变量,避免每次表单提交时重置初始值,从而实现类似“火柴棒剩余数量”的累减功能。
在Web开发中,PHP脚本每次HTTP请求都是无状态的——这意味着变量不会自动跨请求保留。你遇到的问题($mleft 总是重置为36)正是由于每次表单提交都会重新执行整个PHP脚本,而 $mleft = 36 这行代码在每次请求中都会被执行,覆盖了上一次的计算结果。
要解决这个问题,必须将状态“持久化”到服务器端。PHP Session 是最直接、安全且适合初学者的方案:它通过唯一会话ID在多次请求间关联用户,并在服务端存储数据。
✅ 正确做法:使用 $_SESSION
首先,在脚本顶部调用 session_start()(必须位于任何输出之前);然后用 $_SESSION['mleft'] 替代局部变量 $mleft,并设置默认初始值:
<?php
session_start();
?>
<div class="bt_grp">
<form method="post">
<button type="submit" value="1" name="pressed">1</button>
<button type="submit" value="2" name="pressed">2</button>
<button type="submit" value="3" name="pressed">3</button>
<button type="submit" value="4" name="pressed">4</button>
</form>
</div>
<?php
// 从Session读取当前剩余值,首次访问时设为36
$mleft = $_SESSION['mleft'] ?? 36;
if (isset($_POST['pressed'])) {
$subtract = (int)$_POST['pressed']; // 强制转为整数,防止类型隐患
$mleft -= $subtract;
}
// 将最新值写回Session(无论是否提交,都确保状态同步)
$_SESSION['mleft'] = $mleft;
?>
<div class="flex-container">
<div id="matchn">
<h3>Matchsticks left</h3>
<h1><?= htmlspecialchars($mleft) ?></h1>
</div>
</div>⚠️ 关键注意事项
- session_start() 必须放在所有HTML输出之前,否则会触发“Headers already sent”错误;
- 建议为 <button> 显式添加 type="submit",避免部分浏览器默认行为差异;
- 使用 (int) 强制类型转换,防止恶意输入(如字符串 "1abc")导致非预期运算;
- 输出 $mleft 前建议使用 htmlspecialchars() 防止XSS(尤其当值可能来自不可信来源时);
- 若需重置游戏(例如“重新开始”),可添加一个按钮执行 $_SESSION['mleft'] = 36; 或 session_destroy();。
通过Session管理状态,你就能真正实现“按下按钮 → 持续扣减 → 页面实时反映剩余量”的交互逻辑——这是构建计数器、购物车、答题进度等基础功能的核心模式。
立即学习“PHP免费学习笔记(深入)”;











