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');")

然后运行这个select in循环。执行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的结果集,而不是使用会话变量。

最新更新