簡體   English   中英

PHP MySQL - 為什么存儲過程調用在 PHP 代碼中意外結束

[英]PHP MySQL - Why stored procedure call is ended unexpectedly in PHP code

我的存儲過程有一個奇怪的問題。 我編寫了一個在 MySQL 控制台和 MySQL GUI 工具上正確運行的存儲過程:SqlYog。 但它在 PHP 代碼中不起作用。 在 PHP 中運行 SP 是否有任何特定設置? 在我的存儲過程中,我使用了 MySQL session 變量。

我的環境: Windows 10 x64, PHP 7.3, MariaDB: 10.4.13-MariaDB

我附上了我的 SP 代碼的一部分。

問題塊如下:

        SET @p_number = v_number;
        SET @p_quantitySum = v_stock_net;
        EXECUTE stmt1 USING @p_number, @p_quantitySum;

這是一個准備好的聲明。

SET @sql_query = "
        SELECT 
            @b_id := id,
            @b_price := IFNULL(price, 0),           
            @b_ib_seq := seq,
            @b_ib_qty_accumulated := IFNULL(quantitySum, 0) 
        FROM
            (SELECT 
                ib.*,
                (@seq := @seq + 1) AS seq,
                @sum := (@sum + quantity) AS quantitySum 
            FROM
                buying ib 
                INNER JOIN 
                    (SELECT 
                        @sum := 0,
                        @seq := 0) b 
            WHERE ib.number = ?
            ORDER BY ib.date DESC) ib 
        WHERE quantitySum > ? 
        LIMIT 1 ;
    " ;
    PREPARE stmt1 FROM @sql_query ;

PHP 調用: mysqli_query($this->conn, "CALL sp_update_daily_buying('2021-01-21');")

我在循環中運行這個 select。 執行EXECUTE stmt1 USING @p_number, @p_quantitySum; ,我的存儲過程在第三次執行后結束。 那是在循環中,2次都可以,但是在第3次執行之后,SP就結束了。

正如我上面提到的,在 GUI 工具和 MySQL 控制台中,它可以正常工作(循環正確結束)。

有什么具體的設置嗎?

提前致謝!

我可以在幾個小時內修復這個錯誤。

原因是我在存儲過程中使用了多個 SELECT 語句,這些語句沒有變量賦值或 INSERT。 因此存儲過程在執行后返回了多個結果集,這使得 PHP function mysqli_query無法正確處理。 我在 PHP 中找不到如何處理這種情況的解決方案。 也許mysqli_multi_query可以解決這個問題。

但是在存儲過程中,我通過添加變量分配稍微改變了多個選擇語句。 最后,我可以開始工作了。

SELECT          
            id,
            price,
            seq,
            quantitySum 
            INTO @vb_id, @vb_price, @vb_ib_seq, @vb_ib_qty_accumulated
        FROM
            (SELECT 
                ib.*,
                (@seq := @seq + 1) AS seq,
                @sum := (@sum + quantity) AS quantitySum 
            FROM
                item_buying ib 
                INNER JOIN 
                    (SELECT 
                        @sum := 0,
                        @seq := 0) b 
            WHERE ib.number = ?
            ORDER BY ib.date DESC) ib 
        WHERE quantitySum > ? 
        LIMIT 1 

或者我們可以使用臨時 memory 表從 select 獲取結果集,而不是使用 session 變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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