我已经阅读了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
答案 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;
}
当然你应该检查那个循环中的错误