【问题标题】:Calling two stored procedures in mysqli causes 'Commands out of sync' error在 mysqli 中调用两个存储过程会导致“命令不同步”错误
【发布时间】:2014-12-15 16:02:51
【问题描述】:

问题背景

我对我所使用的大多数语言都比较陌生,并且我正在逐渐回过头来改进旧代码。我正在重写一些旧的 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 
} 

问题

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

尝试解决问题的步骤

【问题讨论】:

  • 我认为是因为程序可以请求一些时间来运行。第二个过程在逻辑上不能使用相同的数据库连接同时运行。也许如果你启动两个不同的连接,你可以避免这个问题
  • 啊,对。那么存储过程可以请求时间运行哪些语句不做呢?打开几个连接似乎相当混乱......(除非我的假设是错误的)有没有更好的方法?
  • 可能是在等待第一个程序停止运行?请记住,语句处理由服务器端编程控制,存储过程(我在 java/oracle 中看到)由 db 命令。

标签: php mysql stored-procedures mysqli


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-11
      • 2011-05-03
      • 2020-02-13
      • 2020-12-24
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      相关资源
      最近更新 更多