调用程序在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;
}
我现在该怎么办?谢谢!
答案 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内部,也通过非常简单的过程发生了这个“错误”。原因是我在声明通用变量(不带@前缀)。我将变量更改为以@开头的用户定义变量,此问题已解决。