数据包乱序。预计收到 1 个 6。数据包大小=26

问题描述 投票:0回答:1

我使用 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 ;
php mysql laravel lumen
1个回答
1
投票

尝试将

PDO::ATTR_EMULATE_PREPARES
设置为
true

'options' => [
    PDO::ATTR_EMULATE_PREPARES => true
]    

PDO 将模拟驱动程序的准备语句/绑定参数 本身并不支持他们

第二个错误可能来自

fetchAll()

$queryResult = DB::select('call lending_ewallets_balance_in_merchant(?, ?)', [$userId, $businessId]);
© www.soinside.com 2019 - 2024. All rights reserved.