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

Ovi*_*lia 7 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
$$
Run Code Online (Sandbox Code Playgroud)

其中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;
}
Run Code Online (Sandbox Code Playgroud)

我现在应该怎么做?谢谢!

bas*_*sos 14

在调用返回结果集的存储过程时,似乎存在一个令人讨厌的错误(或特性)..即一个以没有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";
  }
}
Run Code Online (Sandbox Code Playgroud)

示例存储过程:

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;
Run Code Online (Sandbox Code Playgroud)


ame*_*vin 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 存储过程,而不是使用准备和执行(我认为这是愚弄 mysql),如果你使用过程中的参数(如本例所示) ,我认为你的错误将被修复。