错误:命令不同步;你现在不能运行这个命令

Posted

技术标签:

【中文标题】错误:命令不同步;你现在不能运行这个命令【英文标题】:Error: Commands out of sync; you can't run this command now 【发布时间】:2016-03-07 18:06:14 【问题描述】:

我新有很多答案以及与此问题相关的公认答案,但没有一个能解决我的问题。我仍然收到此错误。

程序:

CREATE PROCEDURE getAllProducts()
BEGIN
SELECT * FROM products;
END //

CREATE PROCEDURE getAllCategories()
BEGIN
SELECT * FROM category;
END //

连接和通话:

$link = mysql_connect($host,$username,$password) or die(mysql_error());
mysql_select_db($database, $link) or die(mysql_error());

$allProducts = mysql_query("CALL getAllProducts");
while($row = mysql_fetch_array($allProducts))  

$allCategory = mysql_query("CALL getAllCategories");
while($row = mysql_fetch_array($allCategory))  

我什至在执行下一个查询之前调用了mysql_free_result($allProducts)。但是什么也没发生。

mysql_get_client_info()返回mysqlnd 5.0.5-dev - 081106 - $Revision: 1.3.2.27 $

我发现问题只有在我运行两个查询时才会出现。

【问题讨论】:

每个调用后检查mysql_error() 【参考方案1】:

正如'Commands out of sync' 的 MySQL 文档指出的那样:

[...] 如果您尝试执行两个返回数据的查询,也会发生这种情况 中间不调用 mysql_use_result() 或 mysql_store_result()。

mysql_use_result() 的文档说例如:

在调用 mysql_query() 或 mysql_real_query() 之后,您必须调用 mysql_store_result() 或 mysql_use_result() 用于每个语句 成功生成结果集(SELECT、SHOW、DESCRIBE、EXPLAIN、 检查表等)。您必须 调用 mysql_free_result() 完成结果集之后。

基本上你需要告诉你的客户它应该如何处理结果。

【讨论】:

我收到了Fatal error: Call to undefined function mysql_store_result() 你考虑过使用mysqli吗?由于 php 的 mysql 模块是 deprecated sice PHP 5.5.0 你不应该使用它。 mysql-modules 也已从 PHP 7.0.0 中删除。如果您运行 PHP 7+,这可能会导致问题。 这是一个用 PHP 5.3.0 和 mysql 而不是 mysqli 编写的遗留项目。现在无法将其转换为mysqli。你能从这里帮助我吗?【参考方案2】:

嗯,通常会发生此错误,因为查询中仍有待处理的结果。有mysqli_store_resultmysqli_free_result 函数可用。由于您使用的是mysqlmysql扩展没有此类功能,您可以在执行完第一个过程后尝试关闭连接,然后重新建立连接以执行下一个过程。虽然这不是完美的解决方案,但它适用于您的情况。

mysql_close($connection);
$connection = mysql_connect("localhost","username","password");

你也可以试试

    mysql_free_result($allProducts);

【讨论】:

【参考方案3】:

存储过程总是返回带有错误/警告信息的额外结果集。因此,您的存储过程返回 多个 结果集(来自您的选择查询的实际结果集和额外的错误/警告结果集)。在循环中调用 mysql_fetch_array 只会使其中一个饱和,而另一个仍处于未决状态,从而导致您看到的错误。

我不知道如何使用香草mysql_ 库修复它,使用mysqli_ 你可以发出mysqli_multi_query,然后只使用第一个结果集。请参阅示例in the docs。

【讨论】:

【参考方案4】:

它本身不是一个修复,但如果你坚持使用 mysql_* 函数,并假设你真的想要使用更复杂的存储过程(即你提供的只是一个简化的例子) - 你可以更改存储过程代码以将结果集写入临时表(例如 tmp_getAllProducts)而不是返回它,然后在 PHP 中从中 SELECT

当我被 mysql_* 卡住并且无法升级时,这对我有用...

【讨论】:

你的意思是旧的mysql确实存在问题 @Tapas 我遇到了问题,是的。我不记得它是否与您的问题完全一样,但我无法获得 mysql_ 函数来从存储过程中获取结果。通过搜索在周围 cmets 中找到的一些常见的脏话,很容易在代码中查找该补丁...【参考方案5】:

这是 mysql 扩展的已知限制。您不能在每个连接中使用多个存储过程,或者升级到 mysqli。

https://bugs.php.net/bug.php?id=39727

【讨论】:

以上是关于错误:命令不同步;你现在不能运行这个命令的主要内容,如果未能解决你的问题,请参考以下文章

python 命令不同步;你现在不能运行这个命令”

PHP - 获取:命令不同步;你现在不能运行这个命令

命令不同步..你现在不能在while循环中运行这个命令

PHP mysqli 命令不同步;你现在不能运行这个命令

Python“命令不同步;你现在不能运行这个命令“

命令不同步;在 Mysql 中调用存储过程时,您现在无法运行此命令