PDO插入MySQL报错求助:SQLSTATE[HY093]参数未定义问题排查
解决PDO执行INSERT时的HY093参数错误问题
我一眼就揪出问题所在了——你代码里的占位符大小写不匹配!
咱们仔细对比两处细节:
- 在你的SQL语句里,占位符写的是
:afterbalance(注意balance的首字母是小写b) - 但在
execute方法的参数数组里,你传的是:afterBalance(首字母是大写B)
PDO对占位符的大小写是严格区分的,它找不到:afterbalance对应的参数,自然就抛出了Invalid parameter number的错误。
修正后的代码
$insertTransaction = $odb->prepare("INSERT INTO `cq9_transactions` VALUES(NULL, :userId, :actionType, :account, :createTime, :endTime, :statusTxt, :statusMessage, :beforeBalance, :afterbalance, :currencyCode, :eventJSON, :createdAt, NULL)"); $insertTransaction->execute(array( ':userId' => 1, ':actionType' => 'takeall', ':account' => 'admin', ':createTime' => getDateTime(), ':endTime' => getDateTime(), ':statusTxt' => 'success', ':statusMessage' => 'success', ':beforeBalance' => '1', ':afterbalance' => '1', // 这里把大写B改成小写b,和SQL里的占位符完全匹配 ':currencyCode' => 'CNY', ':eventJSON' => '1', ':createdAt' => serverDateTime() ));
额外避坑建议
- 写SQL占位符和对应参数时,尽量固定一种命名规范(全小写、驼峰式都可以,但要从头到尾保持一致)
- 以后再遇到HY093错误,优先排查这几点:
- 占位符的拼写(包括大小写、特殊字符)是否和参数名完全一致
- SQL语句里的占位符数量,和
execute里的参数数量是否对等 - 有没有重复定义或者遗漏的占位符
内容的提问来源于stack exchange,提问作者Nicholas Déziel
相关产品推荐
相关产品推荐

