You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用meet_me_licence_transaction存储过程报参数数量错误

错误根因

调用存储过程时参数数量不匹配,同时代码存在多处逻辑bug:

  • 存储过程明确定义入参共11个,但PHP调用时实际传入13个参数,核心原因是SpDataProvider传入的参数数组键名与存储过程入参名不对应:业务参数键名缺少v_前缀,也没有提前声明排序、分页对应的三个参数键,导致组件无法正确映射参数位置,自动追加参数时出现重复传参。
  • 存储过程本身存在3个会引发后续报错的逻辑问题:
    1. 查询字段未返回transaction_id,但排序规则使用了该字段,会触发未知列错误
    2. 分页逻辑变量名大小写错误(定义为v_pageIndex,判断时写为v_PageIndex),Linux环境下MySQL大小写敏感会触发未知变量错误
    3. LIMIT语法参数顺序写反,不符合MySQLLIMIT 偏移量,返回条数的语法规则,分页结果会完全错乱
修复步骤

1. 修正PHP调用端参数配置

将参数数组的键名调整为与存储过程入参完全一致,提前声明排序、分页参数的键名,保证组件正确映射参数位置,修改后search()方法内的参数定义如下:

public function search()
{
    $arrParams = array();

    $arrParams['v_private_key']         =  '';
    $arrParams['v_condo_name']          =  $this->condo_name;
    $arrParams['v_unit_name']           =  $this->unit_name;
    $arrParams['v_username']            =  $this->username; 
    $arrParams['v_licence_number']      =  $this->licence_number; 
    $arrParams['v_new_expiry_date']     =  $this->new_expiry_date; 
    $arrParams['v_transaction_mode']    =  $this->transaction_mode;
    $arrParams['v_transaction_date']    =  $this->transaction_date;
    // 声明排序、分页对应参数键,让SpDataProvider自动绑定值,避免额外追加参数
    $arrParams['v_Sort']                =  '';
    $arrParams['v_limit']               =  0;
    $arrParams['v_pageIndex']           =  0;
            
    $dataProvider =   new SpDataProvider([
        'spName'  =>  'meet_me_licence_transaction',
        'params'  =>  $arrParams,
        'sort'=> [
            'attributes' => [
                'transaction_id' => [
                    'asc' => ['transaction_id' => SORT_ASC, 'transaction_id' => SORT_ASC],
                    'desc' => ['transaction_id' => SORT_DESC, 'transaction_id' => SORT_DESC],
                    'default' => SORT_DESC,
                    'label' => 'Name',
                ],
            ],
            'defaultOrder' => ['transaction_id' => SORT_DESC],
        ],  
        'pagination' => [
            'pageSize' => 10,
        ], 
    ]);
    
    return $dataProvider;
}

2. 修正存储过程逻辑bug

2.1 补充缺失的变量声明、查询字段

在存储过程的DECLARE区块新增分页偏移量变量,同时在SELECT字段列表中加入transaction_id:

-- 原有DECLARE区块新增v_offset声明
DECLARE v_offset INT DEFAULT 0;

-- SELECT字段列表最前面加入mmlt.transaction_id
SET v_Select = CONCAT(" SELECT
          mmlt.transaction_id,
          mmlt.condo_name,
          mmlt.unit_name,
          u.username,
          mmlt.licence_number,
          mmlt.new_expiry_date,
          mmlt.transaction_mode,
          mmlt.transaction_amount,
          mmlt.discount,
          mmlt.received_amount,
          mmlt.transaction_date               
        ");  

2.2 修正分页逻辑

替换原有错误的LIMIT判断代码,修正变量名大小写、参数顺序问题:

-- 替换原有的v_PageIndex判断逻辑
IF (v_pageIndex > 0) THEN
    SET v_offset = (v_pageIndex - 1) * v_limit;
    SET v_QueryLimit = CONCAT(" LIMIT ", v_offset, "," , v_limit);
END IF;

修改完成后重新创建存储过程,即可解决参数数量不匹配的报错,同时避免后续运行出现列不存在、分页错乱的问题。

注:当前存储过程使用字符串拼接方式生成动态SQL,存在SQL注入风险,正式环境建议使用预处理绑定参数的方式处理用户输入的查询条件。

内容的提问来源于stack exchange,提问作者UNKNOWN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 11:45:30