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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 02:10:18