PHP+MySQL多级推荐用户统计异常:仅统计部分分支数据求助
问题分析
原代码统计Level C人数仅得到3的核心问题:
- SQL匹配逻辑错误:获取Level A的UID列表(302,304)后,用
WHERE referrer='$abc'查询Level B用户时,SQL会将逗号分隔的字符串当作单个值匹配referrer字段,而实际referrer存储的是单个UID,导致无法匹配到304的下级用户,需改用IN关键字匹配多个UID。 - 字段取值错误:第一个SQL查询的是
group_concat(uid),但取值时用了$row['group_concat(*)'],导致无法正确获取Level A的UID列表。 - 未累加计数:原代码直接输出每个Level B用户的下级数量,未累加得到总数,最终会输出
31而非预期的4。
修正后的代码
$conn = new mysqli($servername, $username, $password, $dbname); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } // 初始化Level C总人数为0 $totalLevelC = 0; // 获取Level A的UID列表,给字段起别名方便取值 $sql = "SELECT GROUP_CONCAT(uid) AS level_a_uids FROM mybb_users WHERE referrer='300'"; $result = mysqli_query($conn, $sql); if (mysqli_num_rows($result) > 0) { $row = mysqli_fetch_assoc($result); $levelAIds = $row['level_a_uids']; // 使用IN查询所有Level B用户(Level A的直接邀请用户) $sql = "SELECT uid FROM mybb_users WHERE referrer IN ($levelAIds)"; $resultLevelB = mysqli_query($conn, $sql); if (mysqli_num_rows($resultLevelB) > 0) { // 遍历每个Level B用户,累加其下级(Level C)的数量 while ($rowLevelB = mysqli_fetch_assoc($resultLevelB)) { $levelBId = $rowLevelB["uid"]; $sqlCount = "SELECT COUNT(*) AS count_level_c FROM mybb_users WHERE referrer='$levelBId'"; $resultCount = mysqli_query($conn, $sqlCount); if (mysqli_num_rows($resultCount) > 0) { $rowCount = mysqli_fetch_assoc($resultCount); $totalLevelC += $rowCount['count_level_c']; } } // 输出最终统计结果 echo $totalLevelC; } else { echo "0"; } } else { echo "0"; } // 关闭数据库连接 $conn->close();
额外优化建议
- 避免变量覆盖:原代码多次复用
$result变量易导致逻辑混乱,修正后使用不同变量名区分不同查询结果。 - SQL注入防护:若UID可能来自用户输入,建议使用预处理语句绑定参数,示例:
// 预处理查询Level B用户的示例(需根据Level A的UID数量动态调整参数) $stmt = $conn->prepare("SELECT uid FROM mybb_users WHERE referrer IN (?, ?)"); $stmt->bind_param("ii", 302, 304); $stmt->execute(); $resultLevelB = $stmt->get_result();
- 递归层级支持:如果需要统计更深层级的用户,可使用递归函数或MySQL的CTE递归查询,避免硬编码层级逻辑。
内容的提问来源于stack exchange,提问作者Higgs Boson
相关产品推荐
相关产品推荐

