PDO执行SQL报SQLSTATE[HY093]错误:绑定变量数与标记数不匹配
问题原因
你混用了SQL字符串拼接和PDO参数绑定两种数据库操作写法:
- 你构造的
$sql语句直接把$email、$key、$expDate三个变量的值拼接进了SQL文本,没有预留:email、:key、:expDate这类命名占位符 - 后续代码又调用了3次
bindParam()方法绑定参数,PDO在执行时找不到对应的参数点位,因此抛出「绑定变量数量与标记数量不匹配」的报错
相同查询在其他服务器可正常运行,大概率是其他环境下的代码没有出现这种写法混用的问题,或者对应环境的PDO配置做了特殊兼容。
修复方案
把拼接变量的SQL语句改为使用命名占位符的写法即可,既匹配后续的参数绑定逻辑,也能避免SQL注入风险:
$expFormat = mktime(date("H"), date("i"), date("s"), date("m"), date("d") + 1, date("Y")); $expDate = date("Y-m-d H:i:s", $expFormat); $key = md5(time()); $addKey = substr(md5(uniqid(rand(), 1)), 3, 10); $key = $key . $addKey; // 修改SQL为占位符写法,不要直接拼接变量 $sql="INSERT INTO `password_reset_temp` (`email`, `key`, `expDate`) VALUES (:email, :key, :expDate);"; $query = $dbh->prepare($sql); $query->bindParam(':email',$email,PDO::PARAM_STR); $query->bindParam(':key',$key,PDO::PARAM_STR); $query->bindParam(':expDate',$expDate,PDO::PARAM_STR); $query->execute();
内容的提问来源于stack exchange,提问作者kil
相关产品推荐
相关产品推荐

