Php 防止;“命令不同步”;通过AJAX调用的MySQL存储过程出错

Php 防止;“命令不同步”;通过AJAX调用的MySQL存储过程出错,php,mysql,ajax,Php,Mysql,Ajax,我有一个MySQL存储过程,它跨一组表更新数据(基本上是主表中的一条记录和一组子表中的相关记录)。它是通过一个PHP函数通过AJAX调用的。(也就是说,AJAX调用的是一个PHP页面,它最终调用了这个SP。)它工作得很好,但现在我试图让它再做一件事,并遇到“命令不同步;现在不能运行这个命令”错误 更改是在主体表中存储一个以上的项,但这样做可能需要将一个项添加到子表(称为ActionTopic)。该页面允许用户从下拉列表中选择或键入新值。我向SP添加了两个参数:一个是下拉列表中选择的PK,另一个是

我有一个MySQL存储过程,它跨一组表更新数据(基本上是主表中的一条记录和一组子表中的相关记录)。它是通过一个PHP函数通过AJAX调用的。(也就是说,AJAX调用的是一个PHP页面,它最终调用了这个SP。)它工作得很好,但现在我试图让它再做一件事,并遇到“命令不同步;现在不能运行这个命令”错误

更改是在主体表中存储一个以上的项,但这样做可能需要将一个项添加到子表(称为ActionTopic)。该页面允许用户从下拉列表中选择或键入新值。我向SP添加了两个参数:一个是下拉列表中选择的PK,另一个是输入的新值。在SP中,我添加了以下代码。它检查是否键入了新值。如果是,它将调用另一个SP,检查键入的值是否已在表中,如果不在表中,则将其添加。(我尝试使用代码内联检查和添加记录,而不是在单独的SP中,我也遇到了同样的问题。)

我试着将对mysqli_next_result的调用加倍(也就是说,连续两次),然后按照Pete的建议将其放入一个循环中。打了两次电话,我仍然会收到相同的错误。对于循环,我等待30秒,然后得到错误500:内部服务器错误

更新2:我尝试了一个mysqli_more_results()的循环(类似于Pete Dishman回复中的循环),并在循环中回显了一个计数器。这段代码让我的互联网连接陷入了爬行状态,我最终不得不打破它,但循环有几十次迭代。刚刚尝试了以下方法:

        mysqli_free_result($result);
        $result = mysqli_store_result($conn);
        mysqli_free_result($result);

        if (mysqli_more_results($conn)) {
            $result = mysqli_store_result($conn);
            mysqli_free_result($result);
        }
        $allresult = getsubmissions($conn);
在失败之前发现明显的延迟


即使你不能告诉我出了什么问题,我也希望你能想出一些方法来调试它

这可能是因为存储过程返回多个结果集(workbench中的两行)。 当从php进行查询时,需要先检索两个结果集,然后才能发送另一个查询,否则会出现“命令不同步”错误

文档似乎暗示只有在使用
mysqli\u multi\u query
时才会出现这种情况,但在使用
mysqli\u real\u query
时,我们的代码中有这种情况

我们的查询代码大致如下:

mysqli\u real\u查询($conn,$sql);
$resultSet=mysqli\u store\u result($conn);
而(!is_null($row=mysqli_fetch_数组($resultSet,mysqli_两者)))
{
$results[]=$row;
}
mysqli_免费_结果($resultSet);
//检查是否还有其他结果
while(mysqli_more_结果($conn))
{
if(mysqli\u下一个结果($conn))
{
$result=mysqli\u store\u result($conn);
如果($result!==FALSE)
{
mysqli_免费_结果($result);
}
}
}
返回$results;

如果使用PDO,代码显然会有所不同,但相同的原则可能适用(请参见)

我已通过重新编写代码解决了自己的问题,该代码处理结果如下:

        if (mysqli_more_results($conn)) {
            mysqli_free_result($result);
            mysqli_next_result($conn);
            $result = mysqli_store_result($conn);
            mysqli_free_result($result);

            if (mysqli_more_results($conn)) {
                mysqli_next_result($conn);
                $result = mysqli_store_result($conn);
                if (!is_null($result) and gettype($result)!== 'boolean') {
                    mysqli_free_result($result);
                }
            }
        }
        $allresult = getsubmissions($conn);

谢谢这让我意识到错误并没有发生在我认为的地方。请参阅我对原始帖子的更新。
        mysqli_free_result($result);
        $result = mysqli_store_result($conn);
        mysqli_free_result($result);

        if (mysqli_more_results($conn)) {
            $result = mysqli_store_result($conn);
            mysqli_free_result($result);
        }
        $allresult = getsubmissions($conn);
        if (mysqli_more_results($conn)) {
            mysqli_free_result($result);
            mysqli_next_result($conn);
            $result = mysqli_store_result($conn);
            mysqli_free_result($result);

            if (mysqli_more_results($conn)) {
                mysqli_next_result($conn);
                $result = mysqli_store_result($conn);
                if (!is_null($result) and gettype($result)!== 'boolean') {
                    mysqli_free_result($result);
                }
            }
        }
        $allresult = getsubmissions($conn);