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

