0

基本上我有一个数组“$badges”,其中包含用户已获取的徽章 ID 列表(这已在上一个查询中进行),我需要为每个 ID 运行另一个查询以选择名称、描述等徽章。

$level = array("#FFFFFF", "#76EE00", "#00FFFF", "#00FFFF", "#FF77FF");
        for ($i = 0; $i < count($badge); $i++) {
        if($stmt = $mysqli->prepare("SELECT badges.name, badges.description, badges.value FROM badges INNER JOIN user_badges ON user_badges.id_badge = ? LIMIT 1")){
            $stmt->bind_param('s', $badge[$i]);
            $stmt->execute();
            echo $badge[$i] . "test";
            $stmt->store_result();
            $stmt->bind_result($name,$description,$value);
            //echo $name;
            $stmt->fetch();
            echo '<div class="badge"><span class="bold" style="color:' . $level[$value] . '">' . $name . '</span></div>';
            $stmt->close();
        }
    }

在这种情况下,徽章数组包含值 1 和 2,如下所示:

array(2) { [0]=> int(1) [1]=> int(2) }

它对每个值都进行了良好的 for 循环。但是,似乎查询针对值 1 执行了两次,而不是针对值 1 和 2。*如果这有任何意义,所以我收到了 id 为 1 而不是 1 和 2 的徽章的两个输出。

我知道我可以使用 foreach 等,但这不是问题所在。我想知道是否有人可以教育我为什么会发生这种情况?我觉得这与绑定结果有关,但我不知道为什么。

4

1 回答 1

1

除了格式错误的 SQL 之外,您运行准备好的语句的方法是非常错误的。您必须将准备工作移到外面,然后在循环中只运行绑定和执行。
这实际上是准备好的陈述的重点

$stmt = $mysqli->prepare("SELECT badges.name, badges.description, badges.value FROM badges INNER JOIN user_badges ON user_badges.id_badge = badges.id WHERE (badges.id = ?) LIMIT 1");
for ($i = 0; $i < count($badge); $i++) {
    $stmt->bind_param('s', $badge[$i]);
    $stmt->execute();
    echo $badge[$i] . "test";
    $stmt->store_result();
    $stmt->bind_result($name,$description,$value);
    //echo $name;
    $stmt->fetch();
    echo '<div class="badge"><span class="bold" style="color:' . $level[$value] . '">' . $name . '</span></div>';
}

另外,这里 JOIN 好像没用,只能查询badges

于 2013-05-26T16:00:30.153 回答