
在php的foreach循环中,应直接将当前迭代项的id嵌入链接url,而非依赖会话变量存储——否则所有链接都会指向最后一次循环的id值。
在动态生成表格时,常见误区是试图用 $_SESSION 在循环中“暂存”当前数据(如 $result['id']),再通过会话传递到目标页面。但正如问题所示, $result) :?> 这一行已造成变量覆盖:内层 $result 覆盖了外层 $result 数组,导致后续迭代逻辑混乱;更关键的是,$_SESSION['id'] = $result['id'] 在每次循环中被反复赋值,最终仅保留最后一次的ID。当用户点击任意“More details”链接时,cpt.php?id=$_SESSION['id'] 实际解析为字符串字面量(且PHP语法错误),根本不会输出真实ID。
✅ 正确做法是直接在HTML链接中输出当前循环项的ID值,无需会话介入:
$row) : ?>
? 关键改进说明:
- 变量命名清晰:使用 $row(或 $item)替代重复的 $result,避免覆盖原始数组;
- URL安全输出:用 urlencode() 编码ID,防止特殊字符(如空格、&)破坏URL结构;
- XSS防护:对输出到HTML的内容使用 htmlspecialchars(),防范跨站脚本攻击;
- 移除冗余会话操作:session_regenerate_id() 和 $_SESSION['id'] 不仅无必要,还引入竞态风险与性能开销,应彻底删除;
- 语义化命名:建议将 $result(易误解为单条记录)重命名为 $results(明确表示结果集数组)。
? 补充提示:在 cpt.php 中,务必通过 $_GET['id'] 获取并验证该ID(例如使用 (int) 强制转换或预处理语句防SQL注入),切勿直接拼接查询——安全性与健壮性同样重要。
立即学习“PHP免费学习笔记(深入)”;











