Php SQLSTATE[HY093]:无效参数编号:绑定变量的数量与令牌的数量不匹配错误

Php SQLSTATE[HY093]:无效参数编号:绑定变量的数量与令牌的数量不匹配错误,php,mysql,sql,Php,Mysql,Sql,我在我的两页上发现了这个错误,我不明白为什么。我已经重写了代码并进行了三次检查,但我找不到哪里出了问题 第一个是: public function academics ($id,$problem_solving , $math_understanding, $cs_understanding , $math_useful , $cs_useful, $math_ava, $cs_ava, $assigment_start, $assigment_submit,

我在我的两页上发现了这个错误,我不明白为什么。我已经重写了代码并进行了三次检查,但我找不到哪里出了问题

第一个是:

 public function academics ($id,$problem_solving ,  $math_understanding,      $cs_understanding ,   $math_useful ,  $cs_useful, $math_ava,  $cs_ava,    $assigment_start,   $assigment_submit,  $travel_time,   $stress,$assigment_when,    $full_part,     $pair_programming,  $attending_class,   $attending_labs,$attending_tutorials,   $extra_reading, $p_progamming,  $q_cs,  $q_maths,   $procrastinating_assigments,    $procrastinating_studying){
    try{
        $stmt = $this->db->prepare("UPDATE student_data SET problem_solving=:problemS, math_understanding=:math_U, cs_understanding=: cs_u, math_useful =:m, cs_useful=:cs_u, math_ava=:ma, cs_ava=:ca, assigment_start=:ass_st, assigment_submit=:assigment_submit, travel_time =:travel_time, stress=: stress, assigment_when =:assigment_when, full_part =:full_part, pair_programming=: pair_programming,   attending_class=: attending_class, attending_labs=: attending_labs, attending_tutorials =:attending_tutorials, extra_reading =:extra_reading, p_progamming=: p_progamming,  q_cs=: q_cs,    q_maths=: q_maths, procrastinating_assigments=:procrastinating_assigments, procrastinating_studying=:procrastinating_studying WHERE user_id=:uid");
        $stmt->bindparam(":uid", $id);
        $stmt->bindparam(":problemS",$problem_solving );
        $stmt->bindparam(":math_U",$math_understanding);
        $stmt->bindparam(":cs_u",$cs_understanding );
        $stmt->bindparam(":m",$math_useful );
        $stmt->bindparam(":cs_u",$cs_useful);
        $stmt->bindparam(":ma",$math_ava);
        $stmt->bindparam(":ca",$cs_ava);
        $stmt->bindparam(":ass_st",$assigment_start);
        $stmt->bindparam(":assigment_submit",$assigment_submit);
        $stmt->bindparam(":travel_time",$travel_time);
        $stmt->bindparam(":stress",$stress);
        $stmt->bindparam(":assigment_when",$assigment_when);
        $stmt->bindparam(":full_part",$full_part    );
        $stmt->bindparam(":pair_programming",$pair_programming);
        $stmt->bindparam(":attending_class",$attending_class);
        $stmt->bindparam(":attending_labs",$attending_labs);
        $stmt->bindparam(":attending_tutorials",$attending_tutorials);
        $stmt->bindparam(":extra_reading",$extra_reading);
        $stmt->bindparam(":p_progamming",$p_progamming);
        $stmt->bindparam(":q_cs",$q_cs);
        $stmt->bindparam(":q_maths",$q_maths);
        $stmt->bindparam(":procrastinating_assigments",$procrastinating_assigments);
        $stmt->bindparam(":procrastinating_studying",$procrastinating_studying);
        $stmt->execute(); 
    } catch(PDOException $e)
    {
        echo $e->getMessage();
    }  
}
第二个是:

public function comps ($id,$long,$often_comp,$gaming,$research,$doc,$music,$vid,$fix,$social){
    try{
        $stmt = $this->db->prepare("UPDATE student_data SET long=:long, often_comp=:often , gaming=:gaming, research=:research, doc=:doc, music=:music, vid=:vid, fix=:fix, social=:social  WHERE user_id=:uid");
        $stmt->bindparam(":uid",$id);
        $stmt->bindparam(":long",$long);
        $stmt->bindparam(":often",$often_comp);
        $stmt->bindparam(":gaming",$gaming);
        $stmt->bindparam(":research",$research);
        $stmt->bindparam(":doc",$doc);
        $stmt->bindparam(":music",$music);
        $stmt->bindparam(":vid",$vid);
        $stmt->bindparam(":fix",$fix);
        $stmt->bindparam(":social",$social);
        $stmt->execute(); 
    } catch(PDOException $e)
    {
        echo $e->getMessage();
    }  
}

好的,这个评论太长了(顺便说一句,这个“长”字没有双关语)

如果这些是而不是打字错误(我希望不是),那么有相当多的绑定在冒号后面有空格

您需要删除它们的空格,还需要将MySQL保留字包装为长的勾号,或者将其重命名为保留字以外的其他字

参考:


脚注:

TBH:我没有数你所有的绑定,所以如果我遗漏了什么,你需要检查所有绑定,确保它们都匹配


编辑:

“我不知道php的空格数,认为它忽略了它们,就像C/C++一样,现在可以工作了。再次感谢大家!!–bandos”

  • 这不是C/C++,而是PHP,在这种语言中,空格确实很重要

    • 打字错误,可能是
      :cs\u
      ?您还可以使用该名称两次。^的可能重复项为
      long
      ,它是一个MySQL保留字,可能因此而关闭。如果有人突然给出答案,我会用那个可能的骗局来结束它。@chris85是的。。。。如果那是打字错误。查看我的评论^然后还有另一个空间
      :q_cs
      。和
      :强调
      -编辑:@chris85这只会变得更好,不是吗?我知道了,谢谢。我早就想成为php中的一个关键字,但它不是,没有想到它是数据库部分的一部分。和空间一起固定的。再次感谢你的帮助@班多斯,不客气。虽然没有义务,但会通知每个人找到解决方案,考虑接受答案,以关闭这个问题。下面是如何返回此处并对勾号/复选标记执行相同操作,直到其变为绿色。这会通知社区,找到了解决方案。否则,其他人可能会认为问题仍然悬而未决,并可能希望发布(更多)答案。欢迎使用Stack.spaces在c/c++中不计算,除非它是硬编码字符串,否则在编译时它们将被忽略
      SET `long`=:long, ...