错误:命令不同步;你现在不能运行这个命令
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_result
和mysqli_free_result
函数可用。由于您使用的是mysql
和mysql
扩展没有此类功能,您可以在执行完第一个过程后尝试关闭连接,然后重新建立连接以执行下一个过程。虽然这不是完美的解决方案,但它适用于您的情况。
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
【讨论】:
以上是关于错误:命令不同步;你现在不能运行这个命令的主要内容,如果未能解决你的问题,请参考以下文章