命令不同步,即使第一个SQL查询不包含结果

时间:2014-11-02 14:29:43

标签: php mysql mysqli

我已经阅读了Commands out of sync; you can't run this command now问题一段时间了,看到你不能留下任何未读的结果,这对我来说很有意义。但是,在下面的例子中,我没有看到我想要免费获得哪些结果。我从下面的PHP和SQL代码中遗漏了无关紧要的东西。

# Set local variables
$sql = "
    SET @STARTDATE = '2014-09-01';
    SET @RANK = 0;
";
if (mysqli_multi_query($conn, $sql)) {
    # Success: do nothing else
} else {
    # Failure: output the error message
    echo "Error: " . $sql . "<br>" . $conn->error;
}

# Fetch and store the results
$sql = "
    SELECT * FROM MyTable
";
$result = mysqli_query($conn, $sql);
if (!$result) {
    echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}

第二个查询(if (!$result)块)返回臭名昭着的Commands out of sync错误。如果我注释掉第一部分,第二个查询运行没有问题。如果我将第一个查询只更改为一个SET语句而不是两个,则第二个查询运行没有问题。因此,似乎我必须从第一部分清除每个单独的SQL语句的“success-flag”。它是否正确?如果是这样,该如何做?

编辑:事实上,您似乎必须在两者之间刷新所有结果。在第1部分和第2部分之间添加以下行解决了这个问题。

while (mysqli_next_result($conn)) {;} // Flush multi_queries

我在PHP手册的用户评论中找到了这个解决方案:http://nl3.php.net/manual/en/mysqli.multi-query.php

1 个答案:

答案 0 :(得分:1)

很简单,您的第一个查询

SET @STARTDATE = '2014-09-01';
SET @RANK = 0;

生成2个结果集,直到它们被处理完毕,即使结果只是一个状态,你也无法继续。

所以你需要做这样的事情: -

if (mysqli_multi_query($conn, $sql)) {
    do {
        /* unload result set */
        if ($result = $mysqli->store_result()) {
            // Check status
            $result->free();
        }
    } while ($mysqli->next_result());
} else {
    # Failure: output the error message
    echo "Error: " . $sql . "<br>" . $conn->error;
}

当然你应该检查那个循环中的错误