[英]MySQL stored procedure caused `Commands out of sync`
調用程序在 MySQL 終端中運行正常,但在 PHP 中,導致Commands out of sync; you can't run this command nowCommands out of sync; you can't run this command now
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 是 function。
在 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;
}
我現在該怎么辦? 謝謝!
在調用返回結果集的存儲過程時,似乎存在一個令人討厭的錯誤(或功能)。 . 即一個以沒有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;
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),如果您 在此示例中使用過程中的參數,我認為您的錯誤將得到修復。
即使在 phpmyadmin 內部,這個“錯誤”也發生在我身上,過程極其簡單。 原因是我聲明了一般變量(沒有 @ 前綴)。 我將變量更改為以@ 為前綴的用戶定義變量,它已解決。
我知道已經很晚了,並且已經有了答案,但是出於完全不同的原因,我收到了相同的消息,所以我將把我的解決方案留在這里:
這實際上是一個非常愚蠢的錯誤。 這只是參數名稱中的拼寫錯誤。 我的 function 有一個名為preferable
的參數:
create function call_client (pereferable int, client_id int) returns int
在 function 正文中,我使用了錯誤名稱的參數preferable
:
if prefered = 1 then
...
end if;
一旦我將prefered
更改為preferable
,它就會再次開始工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.