在mysqli中调用两个存储过程会导致“命令不同步”错误

时间:2014-12-15 16:02:51

标签: php mysql stored-procedures mysqli

问题背景

我对我工作的大多数语言都比较新,而且我逐渐回过头来改进旧代码。我正在重写一些旧的PHP并用调用存储过程替换硬编码的SQL查询(我知道)。

我页面中的代码按以下顺序组织 -

$RESULT_one = $connection->query( ... my first query ... ); 
$RESULT_two = $connection->query( ... my second query ... );

if(isset($RESULT_one) & isset($RESULT_two))
{
    // Generate a form using the results from the queries 
    // Loop through $RESULT_one to populate a combo box 
    $RESULT_one->free(); 
    // Loop through $RESULT_two to populate a combo box 
    $RESULT_two->free(); 
}
else 
{
    // Display an error to the user rather than displaying the form 
} 

问题

将我的第一个查询和第二个查询用CALL替换为存储过程后,收到错误#2014 - Commands out of sync; you can't run this command now

尝试解决问题的步骤

  • This poster on Stack Overflow遇到了类似的问题,接受的答案建议调用next_result()解决问题。 然而,我想在生成表单之前检查对数据库的两次调用是否成功,我不想半生成它,就像它一样。

  • 我看到another question提问者遇到了同样的问题,似乎next_result()是不可避免的,因为"这就是mysqli的工作原理" - 为什么这适用于' raw' SQL而不是存储过程?有什么不同?在生成表单之前,是否有一种有效的方法可以检查两个查询是否成功?我想了解发生了什么以及行为改变的原因。

  • 我偶然发现documentation for mysqli_store_result()这似乎是可能有用的东西。我一直在阅读本文档的评论,但它一点也不清楚。

  • 似乎是the solution is to call next_result() on the mysqli object between calls,正如我从this Stack Overflow question.了解到的

2 个答案:

答案 0 :(得分:1)

调用多个存储过程时,除非采取措施防止错误,否则可能会发生错误Commands out of sync; you can't run this command now

一种方法是在每次存储过程调用as described here后调用mysqli对象上的next_result()

答案 1 :(得分:0)

我在phpmyadmin和在php中运行查询时都遇到了这个错误,只是按建议的方式调用next_result()对我不起作用。从MS-SQL到MariaDB,我需要更改存储过程,以避免使用直接的“ SELECT”查询来填充变量,而是使用“ SELECT ... INTO”查询。普通的SELECT语句在单独的结果集中将所选数据回显给调用方。我相信您随后需要为在存储过程中执行的每个 SELECT语句调用一次“ next_result”,然后才能调用新过程。 “ SELECT ... INTO”不回显任何可大大提高速度并避免此错误的数据。