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

时间:2016-03-07 18:06:15

标签: php mysql stored-procedures stored-functions

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

程序:

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 $

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

4 个答案:

答案 0 :(得分:0)

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

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

您也可以尝试

    mysql_free_result($allProducts);

答案 1 :(得分:0)

存储过程始终返回带有错误/警告信息的额外结果集。因此,存储过程会返回多个结果集(来自select查询的实际结果集以及额外的错误/警告结果集)。在循环中调用mysql_fetch_array只会使其中一个饱和,另一个仍处于待处理状态,从而导致出现错误。

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

答案 2 :(得分:0)

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

当我遇到mysql_ *并且无法升级时,这对我来说有用了......

答案 3 :(得分:0)

这是mysql扩展的已知限制。您必须每个连接不要使用多个存储过程或升级到mysqli。

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