我使用 Lumen v7.0 和 MySQL v8.0.20 以及 Ubuntu 18.04.4 LTS
我在 SQL 中定义了一个存储过程,当我调用它时,出现以下错误:
数据包乱序。预计收到 1 个 6。数据包大小=26
这是连接驱动程序配置:
'mysql' => [
'read' => [
'host' => [
env('DB_HOST')
],
],
'write' => [
'host' => [
env('DB_HOST'),
],
],
'driver' => 'mysql',
'port' => env('DB_PORT', 3306),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => env('DB_PREFIX', ''),
'strict' => env('DB_STRICT_MODE', true),
'engine' => env('DB_ENGINE', null),
],
这是我的代码:
function storedProcedureBalanceInMerchant($userId, $businessId)
{
try {
$stmt = DB::connection('mysql')->getPdo()->prepare("CALL lending_ewallets_balance_in_merchant(?,?);");
$stmt->execute([$userId, $businessId]);
$pdoDataResults = [];
do {
$rowSet = $stmt->fetchAll(PDO::FETCH_ASSOC);
array_push($pdoDataResults, $rowSet);
} while ($stmt->nextRowset());
return loanBnpl($pdoDataResults);
} catch (Exception $exception) {
dd($exception->getMessage());
return ['loan' => collect([]), 'bnpl' => collect([])];
}
}
注意到,当我直接在 MySQL 中调用该存储过程(如
mysql> CALL lending_ewallets_balance_in_merchant(87,165);
)时,它会返回预期结果,不会出现错误。
我该如何解决这个问题?
此外,这是存储过程:
DELIMITER $$
CREATE DEFINER=`administrator`@`localhost` PROCEDURE `lending_ewallets_balance_in_merchant`(IN `user_id_param` BIGINT UNSIGNED, IN `business_id_param` INT UNSIGNED)
NO SQL
BEGIN
DECLARE dossier_id INT;
DECLARE query_string VARCHAR(255) DEFAULT '';
DECLARE cursor_List_isdone BOOLEAN DEFAULT FALSE;
DECLARE user_dossiers CURSOR FOR
Select ld.id, lwp.query_string
FROM lending_users_dossiers ld
JOIN lending_where_to_pays lwp ON ld.lending_where_to_pay_id = lwp.id
WHERE user_id = user_id_param
AND (ld.status = 'activated' OR ld.status = 'finished');
# 'finished' is for loans
DECLARE CONTINUE HANDLER FOR NOT FOUND SET cursor_List_isdone = TRUE;
Open user_dossiers;
loop_List: LOOP
FETCH user_dossiers INTO dossier_id, query_string;
IF cursor_List_isdone THEN
LEAVE loop_List;
END IF;
SET @qry = CONCAT(
"SELECT ld.id lending_dossier_id, ld.type, SUM(let.credit) balance
FROM lending_users_dossiers ld
JOIN lending_ewallet_transactions let
ON ld.id = let.lending_dossier_id
WHERE ld.id = ", dossier_id,
" AND ", business_id_param, " IN(", query_string, ")",
"GROUP BY ld.id, ld.type");
PREPARE stmt FROM @qry;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END LOOP loop_List;
Close user_dossiers;
END$$
DELIMITER ;
尝试将
PDO::ATTR_EMULATE_PREPARES
设置为 true
'options' => [
PDO::ATTR_EMULATE_PREPARES => true
]
PDO 将模拟驱动程序的准备语句/绑定参数 本身并不支持他们
第二个错误可能来自
fetchAll()
$queryResult = DB::select('call lending_ewallets_balance_in_merchant(?, ?)', [$userId, $businessId]);