【问题标题】:SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens...but it does?SQLSTATE [HY093]:无效的参数号:绑定变量的数量与令牌的数量不匹配......但它匹配吗?
【发布时间】:2020-06-07 10:02:00
【问题描述】:

在过去的一个小时里,我一直在与这个问题作斗争,我正要跳出窗外。我正在尝试使用可变数量的参数进行更新查询:数据将来自表单,但某些字段(surName2 和电子邮件)是可选的,因此如果用户用数据填充它们,它们只会包含在查询中.

所以我检查它们是否已设置,如果是,则通过字符串 $strFields 修改查询,然后使用 bindValue() 将它们添加到 $pdo 查询。但是,当我运行它时,我收到一条错误消息,指出绑定参数的数量与查询中的不匹配。我只是找不到我做错了什么,所有 6 个变量都有数据,所有绑定都在执行,但它不起作用:

$strFields = '';
            if (isset($_POST['surName2'])) $strFields .= ', surName2=:surName2';
            if (isset($_POST['email'])) $strFields .= ', email=:email';

            $stmt = $pdo->prepare('UPDATE users SET userName=:userName, name=:name, surName1:=surName1'.$strFields.' WHERE user_id=:user_id');
            $stmt->bindValue(':userName', $_POST['userName']);
            $stmt->bindValue(':name', $_POST['name']);
            $stmt->bindValue(':surName1', $_POST['surName1']);
            if (isset($_POST['surName2'])) $stmt->bindValue(':surName2', $_POST['surName2']);
            if (isset($_POST['email'])) $stmt->bindValue(':email', $_POST['email']);
            $stmt->bindValue(':user_id', $_POST['user_id']);

            $stmt->execute();//Throws the error

【问题讨论】:

  • 输出查询文本,看看有什么问题。
  • 有一个错字surname1:=surName1 — 冒号应该在等号之后
  • 只是不要使用命名占位符。他们太混乱了
  • @YourCommonSense 不是防止 SQL 注入的好习惯吗?
  • 我说的是 named 占位符。虽然也有positional 的。只是问号,你永远不会混淆在哪里放置冒号

标签: php mysql pdo


【解决方案1】:

这行有语法错误

$stmt = $pdo->prepare('UPDATE users SET userName=:userName, name=:name, surName1:=surName1'.$strFields.' WHERE user_id=:user_id');

对于 surName1,您在等号的错误一侧有“:”。 改成这个就行了

$stmt = $pdo->prepare('UPDATE users SET userName=:userName, name=:name, surName1=:surName1'.$strFields.' WHERE user_id=:user_id');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-27
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多