【问题标题】:Stored procedure causes "Commands out of sync" on the next query存储过程在下一个查询中导致“命令不同步”
【发布时间】:2010-02-22 23:38:42
【问题描述】:

我正在使用 mysql 存储过程运行查询:

$AddProf_qr = mysql_query("call AddStudent('$d_Pass', '$d_Titl', '$d_Firs', '$d_Midd',  '$d_Last', '$d_Addr', '$d_City', '$d_Stat', '$d_County',  '$d_Zipc', $d_Gend, '$d_Birh', '$d_Phom', '$d_Phoh', '$d_Phoo', '$d_Email', '$d_Webs', '$d_Natn', '$d_Profsn',  '$d_Compny', '$d_Desig', $d_ProfAcc)", $this->c_remote) or die ("first call" . mysql_error($this->c_remote));

我应该只从通话中得到一个结果:@@IDENTITY = a number;

$AP_result = mysql_fetch_array($AddProf_qr);
$CurrentSID = $AP_result['@@IDENTITY'];

效果很好。但是当我在此之后运行另一个 mysql 更新查询时,它给出了一个错误提示:

错误:2014 (CR_COMMANDS_OUT_OF_SYNC) 消息:命令不同步;你现在不能运行这个命令

我试过插入:

mysql_free_result($AddProf_qr);

但还是一样。

MySQL 调用也执行得很好 脚本的其余部分运行没有问题,上面被注释掉了。但它们不会同时运行。我最好的猜测是,这个电话正在做一些把事情搞砸的事情。

【问题讨论】:

  • 是否可以切换到 mysqli 或 PDO?
  • 我用 mysql 编写了整个脚本(几个查询)。在我重写之前,我希望有人知道这是关于什么的。
  • mysql() 是一堆废话,已弃用

标签: php mysql stored-procedures


【解决方案1】:

您的存储过程正在返回多个结果集。见this post

解决方案?

  • 使用mysqli_multi_query
  • 停止使用古老的 mysql 库 - mysqli 中的 i 代表“改进” - 有充分的理由。

【讨论】:

  • mysqli 没有解决这个问题,但答案非常有帮助:-)
【解决方案2】:

@DMin 是的,这会起作用,但你迟早会导致服务器崩溃。 只需进行数学计算,对一个页面的一个请求就会对数据库产生 3 * 数量的过程! 想想吧!

[更新]解决方案:

$aCategory = array();
$it=0;
$res = $mysqli->multi_query( "call ListCategory();" );
if( $res ) {
  do {
    if ($result = $mysqli->store_result()) { 

        while( $row = $result->fetch_row() ) {
                $aCategory[$it] =$row;
                $it= $it + 1;
        }
        $result->close();
    }
  } while( $mysqli->next_result() );
}

foreach($aCategory as $row){
    echo . $row[0] . " - " . $row[1] . "<br />";
} 

只是想补充一点,您已准备好调用下一个例程。

PS:这样我就不能用了

echo $aCategory['category_id'] ; 
//or 
echo $aCategory->category_id;
//just
echo $aCategory[0] 

【讨论】:

    【解决方案3】:

    在这里查看:http://us3.php.net/manual/en/function.mysql-query.php 在 cmets 中,一个人声称他通过将连接标志设置为 MYSQL_MULTI_RESULTS (131072) 使其工作。

    不过用mysqli会好很多...

    【讨论】:

    • 好的,解决了。不是世界上最好的解决方案,但只要它有效,我就很高兴。这是我脚本中的第一个查询。我与数据库建立了连接,运行了查询。关闭了连接。建立新的连接并运行脚本的其余部分。 :)
    【解决方案4】:

    mysql_free_result(client->res);

    while (mysql_more_results(client->conn))
    {
        mysql_next_result(client->conn);
    }
    

    这对我来说很有魅力:)

    【讨论】:

      【解决方案5】:

      使用 mysqli_query() 无法正确获取从存储过程返回的结果集。 mysqli_query() 函数将语句执行和将第一个结果集提取到缓冲结果集中(如果有)结合起来。但是,还有一些对用户隐藏的附加存储过程结果集,导致 mysqli_query() 无法返回用户预期的结果集。

      使用 mysqli_real_query() 或 mysqli_multi_query() 获取从存储过程返回的结果集。这两个函数都允许获取语句返回的任意数量的结果集,例如 CALL。

      official manual

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-11
        • 2020-12-24
        • 1970-01-01
        • 2012-03-27
        • 2019-04-25
        • 1970-01-01
        • 2019-03-05
        相关资源
        最近更新 更多