【问题标题】: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()

标签: php mysql stored-procedures stored-functions


【解决方案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

      【讨论】:

        猜你喜欢
        • 2013-04-08
        • 2020-04-20
        • 2021-06-11
        • 2016-05-28
        • 2015-04-16
        • 1970-01-01
        • 1970-01-01
        • 2013-10-05
        相关资源
        最近更新 更多