基本上我有一个数组“$ 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等,但这不是问题所在。我想知道是否有人可以告诉我为什么会发生这种情况?我认为这与绑定结果有关,但我不知道为什么。
答案 0 :(得分: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
表