PHP开发LMS系统时foreach循环内$_SESSION值被覆盖传值错误问题
问题根因
你的$_SESSION赋值逻辑写在PHP循环里,PHP作为服务端语言会先执行完页面所有PHP代码,才会把生成的HTML页面返回给用户浏览器,所以循环跑完后$_SESSION['className']一定会被最后一次循环的班级名覆盖,和你点击哪个卡片完全无关。
解决方案1:GET参数传递(快速实现)
直接把点击对应的班级标识通过URL参数传递给跳转页:
- 修改卡片的跳转逻辑,把班级名编码后加入URL参数,同时删除循环内冗余的SESSION赋值代码:
foreach($datas as $data){ ?> <div style="background-color: #3B4FDF; border-radius: 3%; width: 30%; height: 220px; margin-right: 5%; cursor: pointer;" onclick="location.href='classAdmin_list.php?class_name=<?= urlencode($data['class_name']) ?>'"> <p style="font-size: 1.5vw; color: white; position: relative; left: 7%; top: 0%;"> <?= $data['class_name'] ?> </p> <p style="font-size: 1vw; color: white; position: relative; left: 75%; top: -25%;"> <?= $data['class_code'] ?> </p> <p style="font-size: 1vw; color: white; position: relative; left: 7%; top: 17%;"> <?= $data['school'] ?> </p> <img src="foto/balll.png" alt="ball" style="opacity: 0.5; width: 22%; height: 100px; position: relative; left: 75%; top: -30%;"> </div> <?php } ?>
- 修改跳转页
classAdmin_list.php的班级名取值逻辑,加htmlspecialchars防止XSS攻击:
<p> Class <span><?= htmlspecialchars($_GET['class_name']) ?></span> </p>
解决方案2:传班级ID(更安全规范)
如果班级名存在特殊字符、或者担心用户随意修改URL参数伪造班级名,更推荐传递班级唯一ID:
- 跳转链接改为
classAdmin_list.php?class_id=<?= $data['class_id'] ?> - 跳转页接收到
class_id后,到数据库查询对应的班级名称再输出,既安全又能避免参数乱码问题。
内容的提问来源于stack exchange,提问作者Lirik Rexhepi
相关产品推荐
相关产品推荐

