将Session用户数据转为变量遇问题:拳击匹配网站开发求助
帮你解决会话用户变量与匹配功能的问题
嘿,我看了你这段代码,发现几个关键问题,同时帮你补上拳击练习网站需要的同属性用户匹配逻辑,一步步来:
首先,现有代码的核心问题
- SQL注入风险拉满:直接把
$_GET["userID"]拼进SQL里,恶意用户随便构造个参数就能搞乱你的数据库,这绝对不能留。 - 没用到会话用户:你要的是针对当前会话用户操作,但现在靠URL传
userID,既不安全也不符合会话的设计逻辑,应该从$_SESSION里取当前登录用户的ID才对。 - 缺匹配逻辑:代码只查了单个用户的信息,完全没实现和同体重用户匹配的核心需求。
修正后的完整代码(带匹配功能)
<?php session_start(); // 先拦未登录用户:必须有会话里的userID才能访问 if (!isset($_SESSION['userID'])) { header("Location: login.php"); // 跳去登录页 exit(); } include "connection.php"; // 从Session拿当前用户ID,这才是正确的姿势 $currentUserID = $_SESSION['userID']; // 用预处理语句查当前用户信息——彻底杜绝SQL注入 $stmt = $con->prepare("SELECT * FROM userdetails WHERE userID = ?"); $stmt->bind_param("i", $currentUserID); // "i"代表整数,要是你userID是字符串就改成"s" $stmt->execute(); $result = $stmt->get_result(); if ($result->num_rows > 0) { $currentUser = $result->fetch_assoc(); // 输出当前用户信息,记得用htmlspecialchars防XSS echo "<div>"; echo "<br>First name: " . htmlspecialchars($currentUser["firstname"]); echo "<br>Weight: " . htmlspecialchars($currentUser["weight"]) . " kg"; echo "</div>"; // 重点:匹配同体重的其他用户 echo "<h3>你的同体重练习伙伴</h3>"; $matchStmt = $con->prepare("SELECT * FROM userdetails WHERE weight = ? AND userID != ?"); // 这里"d"是浮点数,要是weight是整数就改成"i",根据你数据库字段类型调整 $matchStmt->bind_param("di", $currentUser["weight"], $currentUserID); $matchStmt->execute(); $matchResult = $matchStmt->get_result(); if ($matchResult->num_rows > 0) { echo "<ul>"; while ($matchUser = $matchResult->fetch_assoc()) { echo "<li>" . htmlspecialchars($matchUser["firstname"]) . " - 体重: " . htmlspecialchars($matchUser["weight"]) . " kg</li>"; } echo "</ul>"; } else { echo "<p>暂时还没找到和你体重相同的练习伙伴哦</p>"; } $matchStmt->close(); } else { echo "<p>找不到当前用户的信息,请检查登录状态</p>"; } // 记得关闭语句和连接,养成好习惯 $stmt->close(); $con->close(); ?>
几个关键改进的说明
- 会话验证:先检查
$_SESSION['userID'],确保只有登录用户能进来,符合你说的“会话用户”需求。 - 预处理语句:用
prepare()+bind_param()绑定参数,再也不怕SQL注入了,这是PHP操作数据库的标准安全做法。 - 匹配逻辑:专门加了查询同体重但不同ID用户的语句,直接实现你要的匹配功能。
- 输出安全:所有从数据库拿出来的内容都用
htmlspecialchars()转义,防止恶意脚本注入(XSS攻击)。
内容的提问来源于stack exchange,提问作者Richard Pearson
相关产品推荐
相关产品推荐

