簡體   English   中英

MySQL 存儲過程導致`命令不同步`

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM