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


Calling two stored procedures in mysqli causes 'Commands out of sync' error

问题上下文

我对我正在使用的大多数语言都比较陌生,我正在逐渐返回并改进旧代码。我正在重写一些旧的 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 s 后,我收到错误#2014 - Commands out of sync; you can't run this command now

为尝试解决问题而采取的步骤

  • 这张关于堆栈溢出的海报也有类似的问题,接受的答案建议打电话给next_result()来解决他们的问题。但是,我想在生成表单之前检查对数据库的两次调用是否成功,我不想像以前那样半生成它。

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

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

  • 似乎解决方案是在调用之间调用 mysqli 对象上的 next_result(),正如我从这个堆栈溢出问题中学到的那样。

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

一种方法是在每次存储过程调用后对 mysqli 对象调用 next_result(),如此处所述。

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