每次使用不同的参数运行相同的 mysqli 查询

Posted

技术标签:

【中文标题】每次使用不同的参数运行相同的 mysqli 查询【英文标题】:Running the same mysqli query with different parameters each time 【发布时间】:2013-05-26 15:21:55 【问题描述】:

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

【问题讨论】:

看起来你的 SQL 是错误的。无用的 JOIN 可能会导致你得到的结果。您是否在控制台中尝试过此查询? 哇,抱歉,我什至都懒得看查询。你是对的,我把它改成了:“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”并且它正在工作现在好了。谢谢! 【参考方案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好像没用,只能查询badgestable

【讨论】:

我确定你是对的,但这样做会导致我出现很多错误吗?警告:mysqli_stmt::store_result(): 无法在 etc etc 中获取 mysqli_stmt 啊,忘记从循环中删除关闭

以上是关于每次使用不同的参数运行相同的 mysqli 查询的主要内容,如果未能解决你的问题,请参考以下文章

CloudKit - 每次运行相同的查询时,CKQueryOperation 结果都不同

相同的查询,相同的数据库,不同的结果

查询每次运行都返回相同的数据

php mysqli 查询期望参数 1 为字符串

Mysqli 连接来自 2 个不同数据库的表

使用不同的参数并行运行相同的函数,并知道哪个并行运行在 python 中结束了