PDO执行UPDATE时报SQLSTATE[HY093参数未定义错误怎么解决?
PDO报错SQLSTATE[HY093问题解决
错误原因
你的SQL预处理语句中定义的占位符名称和绑定参数时使用的名称不匹配:
SQL里为user_id字段声明的占位符是:used_by,但调用bindParam方法绑定时使用的参数名是:user,PDO无法找到SQL语句中需要的:used_by参数,同时多绑定了一个SQL中不存在的:user参数,因此触发参数数量/定义无效的报错。
修复方案
将绑定用户ID的参数名修改为和SQL占位符一致的:used_by即可,修改后的代码如下:
function update_key($id, $keyUsed){ $update_statement = $this->pdo->prepare("UPDATE `private_key` SET `used` = :used, `user_id` = :used_by WHERE `key` = :keyText"); $used_num = 1; $update_statement->bindParam(':used', $used_num, PDO::PARAM_INT); $update_statement->bindParam(':used_by', $id, PDO::PARAM_INT); $update_statement->bindParam(':keyText', $keyUsed, PDO::PARAM_STR); $update_statement->execute(); }
同类报错通用排查逻辑
以后再遇到SQLSTATE[HY093]类型的报错,可优先检查三个要点:
- SQL中声明的所有占位符都有对应的参数绑定操作,没有遗漏
- 所有绑定的参数都能在SQL中找到对应的占位符,没有多余绑定
- 占位符的拼写、大小写完全一致,PDO的参数名是区分大小写的
内容的提问来源于stack exchange,提问作者Luke Harrison
相关产品推荐
相关产品推荐

