存储过程导致下一个查询“命令不同步”

时间:2010-02-22 23:38:43

标签: php mysql stored-procedures

我正在使用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 =一个数字;

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

工作正常。但是当我在此之后运行另一个mysql更新查询时,它会出错:

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

我试过插入:

mysql_free_result($AddProf_qr);

但仍然相同。

MySQL调用也可以正常执行 脚本的其余部分运行没有问题,上面已注释掉。但它们不会同时运行。我最好的猜测是,这个电话正在做一些弄乱这个问题的事情。

5 个答案:

答案 0 :(得分:8)

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

解决方案?

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

答案 1 :(得分: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] 

答案 2 :(得分:0)

点击这里:http://us3.php.net/manual/en/function.mysql-query.php在评论中,有人声称他通过将连接标志设置为MYSQL_MULTI_RESULTS(131072)来使其工作。

但是使用mysqli会好得多......

答案 3 :(得分:0)

了mysql_free_result(客户端 - &GT; RES);

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

这给我带来了魅力:)

答案 4 :(得分:0)

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

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

查看official manual

相关问题