You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

插入数据库遇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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:59:56