插入数据库遇HY093错误:绑定变量与令牌数量不匹配
解决PDO插入数据时的参数不匹配错误
嘿,我一眼就发现你代码里的问题啦!你遇到的SQLSTATE[HY093]错误,根源在于你重复覆盖了$sql和$stmt变量,导致最后执行的SQL语句和你绑定的参数完全不匹配。
问题详细分析
你先写了第一个插入policajt表的SQL,并且准备了对应的$stmt,但紧接着你又重新给$sql和$stmt赋值成了插入users表的语句。最后你绑定的参数里包含了:fname、:lname、:co这些第一个SQL里的占位符,但最后执行的却是第二个只有:username和:password(947618是SQL函数,不需要绑定参数)的SQL,参数数量自然对不上,所以触发了错误。
修正后的代码
正确的做法是分两次准备并执行两个SQL,而且为了保证数据一致性(避免插入第一个表成功但第二个表失败的情况),最好用事务来包裹这两个操作:
try { // 开启事务,保证两个插入操作要么都成功,要么都回滚 $conn->beginTransaction(); // 第一步:向policajt表插入数据 $sql_policajt = "INSERT INTO policajt (meno, priezvisko, cislo_odznaku) VALUES (:fname, :lname, :co)"; $stmt_policajt = $conn->prepare($sql_policajt); $stmt_policajt->bindParam(':fname', $_POST['fname'], PDO::PARAM_STR); $stmt_policajt->bindParam(':lname', $_POST['lname'], PDO::PARAM_STR); $stmt_policajt->bindParam(':co', $_POST['co'], PDO::PARAM_STR); $stmt_policajt->execute(); // 获取刚插入的policajt记录的自增ID $policajt_id = $conn->lastInsertId(); // 第二步:向users表插入关联数据 $sql_users = "INSERT INTO users (policajt_id, username, heslo) VALUES (:policajt_id, :username, :password)"; $stmt_users = $conn->prepare($sql_users); $stmt_users->bindParam(':policajt_id', $policajt_id, PDO::PARAM_INT); $stmt_users->bindParam(':username', $_POST['username'], PDO::PARAM_STR); $password = password_hash($_POST['password'], PASSWORD_BCRYPT); $stmt_users->bindParam(':password', $password, PDO::PARAM_STR); $stmt_users->execute(); // 提交事务,确认所有操作生效 $conn->commit(); $message = 'Successfully created new user'; } catch(PDOException $e) { // 出错时回滚事务,撤销所有操作 $conn->rollBack(); $message = 'Sorry there must have been an issue creating your account: ' . $e->getMessage(); }
额外调试提示
建议开启PDO的异常错误模式,这样能获取更详细的错误信息,方便定位问题:
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
内容的提问来源于stack exchange,提问作者vonston
相关产品推荐
相关产品推荐

