MySQL存储过程导致`命令不同步'

时间:2011-07-05 12:58:15

标签: php mysql

调用程序在MySQL终端中可以正常工作,但在PHP中,导致Commands out of sync; you can't run this command nowCommands out of sync; you can't run this command now

我的程序是

delimiter $$
create procedure getMostSimilar (IN vU_ID INT, IN voffset INT, IN vsize INT)
BEGIN
set @offset = voffset;
set @size = vsize;
set @uid = vU_ID;
prepare SimilarStmt from
"SELECT U_ID, getSimilarity(U_ID, ?) AS similar FROM Answer WHERE U_ID != ? GROUP BY U_ID ORDER BY similar DESC LIMIT ?, ?";
execute SimilarStmt using @uid, @uid, @offset, @size; 
deallocate prepare SimilarStmt;
END
$$

其中getSimilarity是一个函数。

在PHP中:

function getMostSimilar($U_ID, $offset, $size){
    $query = sprintf("CALL getMostSimilar(%s, %s, %s)",
                $U_ID, $offset, $size);
    $result = mysql_query($query);
    print mysql_error();
    if (!$result){
        return $query;
    }
    $ans = array();
    $len = 0;
    while($row = mysql_fetch_assoc($result)){
        $ans[$len] = $row;
        $len++;
    }
    return $ans;
}

我现在该怎么办?谢谢!

4 个答案:

答案 0 :(得分:13)

在调用返回结果集的存储过程时,似乎存在一个令人讨厌的错误(或功能)。。即以没有INTO子句的select语句结束的存储过程(参见下面的示例)。

mysqli驱动程序(可行)返回2个结果集。第一个是从存储过程返回的,第二个是虚拟的空结果集。它就像发出了多个查询命令。对此的一个解决方案(通常(例如SELECT)查询不会中断)是在处理合法的(第一个)之后使用这个虚拟结果集。

示例php代码

function do_query($con, $sql)
{
  if ( !($result = mysqli_query($con, $sql)) )
    throw new QueryException(mysqli_error($con));
  if ($result === true)
     return true;
  while ($row = mysqli_fetch_assoc( $result )) {
    // process rows
  }
  // Hack for procedures returning second dummy result set
  while(mysqli_more_results($con)) {
    mysqli_next_result($con);
    // echo "* DUMMY RS \n";
  }
}

示例存储过程:

CREATE PROCEDURE selectStaleHeaders()
NOT DETERMINISTIC
SELECT TT.*
FROM one_pretty_table AS TT
  LEFT JOIN another AS AN on TT.fk_id = AN.id
WHERE TT.id IS NULL;

答案 1 :(得分:1)

  

C.5.2.14。命令不同步如果你   让命令不同步;你不能   现在在您的客户端运行此命令   代码,您正在调用客户端函数   错误的顺序。

     

例如,如果您这样做,就会发生这种情况   正在使用mysql_use_result()并尝试   在你拥有之前执行一个新的查询   叫做mysql_free_result()。它可以   如果你试图执行两个也会发生   没有返回数据的查询   调用mysql_use_result()或   mysql_store_result()介于两者之间。

http://dev.mysql.com/doc/refman/5.0/en/commands-out-of-sync.html

修改

我认为你需要重写getMostSimilar存储过程,而不是使用prepare和execute(我认为这是愚弄mysql),如果你使用像 in this example这样的过程中的参数我认为你的错误将被修复。

HTH

答案 2 :(得分:0)

我知道它已经很晚了,而且已经有了答案,但是由于一个完全不同的原因,我得到了同样的信息,所以我会在这里留下我的解决方案:

实际上这是一个非常愚蠢的错误。这只是参数名称中的拼写错误。  我的函数有一个名为preferable的参数:

create function call_client (pereferable int, client_id int) returns int 

在函数体中,我使用的参数preferable名称错误:

if prefered  = 1 then
  ...
end if;

一旦我为prefered更改preferable,它就再次开始工作了。

答案 3 :(得分:0)

即使在phpmyadmin内部,也通过非常简单的过程发生了这个“错误”。原因是我在声明通用变量(不带@前缀)。我将变量更改为以@开头的用户定义变量,此问题已解决。