微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP MySQL - 为什么存储过程调用在 PHP 代码中意外结束

如何解决PHP MySQL - 为什么存储过程调用在 PHP 代码中意外结束

我的存储过程有一个奇怪的问题。 我编写了一个可以在 MysqL 控制台和 MysqL GUI 工具上正确运行的存储过程:sqlYog。 但它在 PHP 代码中不起作用。 是否有任何特定设置可以在 PHP 中运行 SP?在我的存储过程中,我使用了 MysqL 会话变量。

我的环境: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');")

我循环运行这个选择。执行 EXECUTE stmt1 USING @p_number,@p_quantitySum; 后,我的存储过程在第三次执行后结束。 就是在循环中,2次都可以,但是第三次​​执行后,SP就结束了。

正如我上面提到的,在 GUI 工具和 MysqL 控制台中,它可以正常工作(循环正确结束)。

有什么具体的设置吗?

提前致谢!

解决方法

我可以在几个小时内修复这个错误。

原因是我在存储过程中使用了多个 SELECT 语句,这些语句没有变量赋值或 INSERT。所以存储过程在执行后返回了多个结果集,这使得 PHP 函数 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 

或者我们可以使用临时内存表来从 select 中获取结果集,而不是使用会话变量。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。