You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP+MySQL多级推荐用户统计异常:仅统计部分分支数据求助

问题分析

原代码统计Level C人数仅得到3的核心问题:

  1. SQL匹配逻辑错误:获取Level A的UID列表(302,304)后,用WHERE referrer='$abc'查询Level B用户时,SQL会将逗号分隔的字符串当作单个值匹配referrer字段,而实际referrer存储的是单个UID,导致无法匹配到304的下级用户,需改用IN关键字匹配多个UID。
  2. 字段取值错误:第一个SQL查询的是group_concat(uid),但取值时用了$row['group_concat(*)'],导致无法正确获取Level A的UID列表。
  3. 未累加计数:原代码直接输出每个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 16:50:25