防止通过AJAX

时间:2019-02-05 16:57:36

标签: php mysql ajax

我有一个MySQL存储过程,该存储过程可更新一组表中的数据(主要是针对主体表中的一条记录以及一组子表中的相关记录)。通过PHP函数通过AJAX调用。 (也就是说,AJAX调用是指向PHP页面的,最终将调用此SP。)它工作正常,但是现在我试图使它做更多的事情,并遇到“命令不同步;您可以立即不运行此命令”。

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

if cNewTopic <> '' then
    -- First, make sure the new topic isn't already there
    call aoctest.AddActionTopic(cNewTopic);
    -- SELECT @iTopicID := iID FROM ActionTopic WHERE UPPER(Description) = UPPER(cNewTopic);
    SET @iTopicID = LAST_INSERT_ID();
else
    SET @iTopicID = Topic;
end if;

如果用户从下拉菜单中进行选择,则该页面有效。仅当用户键入新值时,才会出现此问题。即使出现错误,其他所有内容也都可以正常工作。新值将添加到子表中,并且父表和其他子表将按预期更新。

有趣的是,如果我在MySQL Workbench中使用相同的参数调用SP(在确保新值不在新表中之后),它将运行无错误。我注意到的唯一奇怪的是,我在MySQL Workbench的Output部分获得了两行,而不是一行。两者都显示对SP的呼叫。第一个显示“返回1行”和一段时间,而第二个显示“返回0行”和“-/ 0.000秒”。在表中已经有新值的MySQL Workbench中,对SP的调用也会在“输出”部分显示两行,但第二行显示“返回了1行”。

不确定此处是否需要其他任何代码。如果您认为我需要展示更多内容,请询问。

更新:基于Pete Dishman的评论,我更加仔细地研究了错误发生的位置。这不是原始SP调用给出错误。这是对MySQL的下一个调用,仍然在Ajax调用中。

处理结果的代码已经有以下代码:

//not sure why next line should be needed.
mysqli_next_result($conn);

我尝试了简单地将对mysqli_next_result的调用加倍(即连续两次),然后按照Pete建议的方式将其放入循环中。通过两次呼叫,我仍然遇到相同的错误。循环运行,我等待30秒,然后收到错误500:内部服务器错误。

更新2:我尝试使用mysqli_more_results()的循环(类似于Pete Dishman的答复中的循环),并在循环内回显一个计数器。该代码使我的Internet连接变得很容易爬网,最终我不得不中断它,但是循环进行了数十次迭代。刚尝试以下操作:

        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);

在失败之前发现了明显的延迟。

即使您不能告诉我什么地方出了问题,我也很感谢您提供调试方法的想法。

2 个答案:

答案 0 :(得分:0)

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

文档似乎暗示只有在使用let list = { value: 1, rest: { value: 2, rest: { value: 3, rest: null } } }; function listToArray(list) { let arrays = []; for (let node = list; node; node = node.rest) { console.log("Current node is: " + JSON.stringify(node)); console.log("Node value is: " + node.value); arrays.push(node.value); console.log("Next node will be: " + JSON.stringify(node.rest)); } return arrays; } console.log(listToArray(list));时才会出现这种情况,但是在使用mysqli_multi_query时我们会将其包含在代码中。

我们的查询代码如下:

mysqli_real_query

如果您使用的是PDO,则代码显然会有所不同,但是相同的原理可能适用(请参见http://php.net/manual/en/pdostatement.nextrowset.php

答案 1 :(得分:0)

我通过重新编写处理结果的代码来解决了自己的问题:

        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);