调用程序在 MySQL 终端中运行正常,但在 PHP 中,导致 命令不同步;你现在不能运行这个命令命令不同步;你现在不能运行这个命令
我的程序是
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;
}
我现在该怎么办?谢谢!
最佳答案
在调用返回结果集的存储过程时,似乎出现了一个令人讨厌的错误(或功能)。 IE。以不带 INTO 子句的 select 语句结尾的存储过程(参见下面的示例)。
mysqli 驱动程序(可能)返回 2 个结果集。第一个是从存储过程返回的结果,第二个是虚拟的空结果集。这就像发出了一个多查询命令。一个解决方案(不会中断通常的(例如 SELECT)查询)是在处理合法结果集(第一个)后使用这个虚拟结果集。
示例 PHP 代码
function do_query($con, $sql)
{
$result = mysqli_query($con, $sql);
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;
关于php - MySQL存储过程导致 `Commands out of sync`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6583020/