我有一个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);
在失败之前发现了明显的延迟。
即使您不能告诉我什么地方出了问题,我也很感谢您提供调试方法的想法。
答案 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);