0

基本的に、ユーザーが取得したバッジ ID のリストを含む配列「$badges」があります (これは以前のクエリで作成されたものです)。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 と 2 ではなく、値 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>';
}

badgesまた、ここではJOINは役に立たないようで、テーブルのみをクエリできます

于 2013-05-26T16:00:30.153 に答える