调用程序在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)
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),如果你使用过程中的参数(如本例所示) ,我认为你的错误将被修复。