PHP脚本无法获取MyBB论坛层级推荐用户C数据的问题求助
问题分析与修复方案
核心问题
你的代码存在两个关键问题,导致无法正确获取用户C的数据:
- 变量覆盖丢失数据:第一个
while循环里,$abc每次都会被新的用户B的UID覆盖,最终仅保留最后一个用户B的UID。如果用户A推荐了多个用户B,你只会查询最后一个B推荐的C;如果这个B没有推荐C,自然返回0结果。 - 未处理无用户B的边界情况:若用户A没有推荐任何用户B,
$abc变量未被定义,直接代入第二个SQL语句会导致语法错误或无效查询。
另外,直接将变量拼入SQL语句存在SQL注入风险,这是严重的安全问题。
修复代码示例
下面是优化后的代码,解决上述问题同时提升安全性:
// 创建连接 $conn = new mysqli($servername, $username, $password, $dbname); // 检查连接 if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } // 预处理查询用户A推荐的所有用户B的UID $stmt = $conn->prepare("SELECT uid FROM mybb_users WHERE referrer = ?"); $stmt->bind_param("i", $userIdA); // $userIdA是用户A的UID,示例中为24 $userIdA = 24; $stmt->execute(); $resultB = $stmt->get_result(); $userBUids = []; if ($resultB->num_rows > 0) { // 将所有用户B的UID存入数组 while ($row = $resultB->fetch_assoc()) { $userBUids[] = $row["uid"]; } } else { echo "用户A没有推荐任何用户"; $conn->close(); exit; } // 循环查询每个用户B推荐的用户C foreach ($userBUids as $bUid) { $stmtC = $conn->prepare("SELECT uid FROM mybb_users WHERE referrer = ?"); $stmtC->bind_param("i", $bUid); $stmtC->execute(); $resultC = $stmtC->get_result(); if ($resultC->num_rows > 0) { echo "用户B($bUid)推荐的用户C:"; while ($row = $resultC->fetch_assoc()) { echo $row["uid"] . " "; } echo "<br>"; } else { echo "用户B($bUid)没有推荐任何用户<br>"; } $stmtC->close(); } $stmt->close(); $conn->close();
额外说明
- 使用预处理语句(
prepare/bind_param)避免SQL注入,同时保证查询语法正确。 - 将用户B的UID存入数组,遍历每个B查询对应的C,不会遗漏任何可能的用户C。
- 增加边界情况处理,当用户A没有推荐用户时直接提示并终止程序,避免后续错误。
内容的提问来源于stack exchange,提问作者Higgs Boson
相关产品推荐
相关产品推荐

