Php 请有人在此帮助我:SQLSTATE[HY093]:无效参数编号:绑定变量的数量与令牌的数量不匹配

Php 请有人在此帮助我:SQLSTATE[HY093]:无效参数编号:绑定变量的数量与令牌的数量不匹配,php,mysql,pdo,Php,Mysql,Pdo,我将此作为一个社区维基答案发布,因为这里不应该有任何代表,我也不希望有代表;给出了一个无法确定缺少哪一个的答案 它是用于$stmt->bindparam(“:address”,$address”)的 还要确保所有变量都包含值 PHP的错误报告将有助于: 旁注:使用一个代码编辑器,当双击时自动查找匹配的单词,并使用相同的命名约定,将大大有助于您 其中一个(免费)选项是Notepad++ sql语句不一致:表列和值不一致 插入不一致。例如,在当前位置字段中 您正在尝试插入值:join和,等

我将此作为一个社区维基答案发布,因为这里不应该有任何代表,我也不希望有代表;给出了一个无法确定缺少哪一个的答案

它是用于
$stmt->bindparam(“:address”,$address”)的值()中缺少的代码>

还要确保所有变量都包含值

PHP的错误报告将有助于:

旁注:使用一个代码编辑器,当双击时自动查找匹配的单词,并使用相同的命名约定,将大大有助于您

  • 其中一个(免费)选项是Notepad++
      • sql语句不一致:表列和值不一致 插入不一致。例如,在
        当前位置
        字段中 您正在尝试插入值
        :join和
        ,等等
      • 此外,就数量而言,要插入的列和值不相同 重合:在20个字段中插入19个值
      建议:

      我的建议是始终使用列名作为标记名。然后您就可以确切地知道要将相应的值插入到哪些标记中

      NB:标记:“…值(:标记1,:标记2,…);”

      您还应该定义要绑定的输入参数的类型。例如:

      public function register($uname,$age,$sex,$image,$dpart,$joind,$job,$uposition,$phone,$umail,$upass,
                                   $unumber,$address,$nssf,$bank,$passp,$home,$village,$nation,$permit)
          {
              try
              {
                  $new_password = password_hash($upass, PASSWORD_DEFAULT);
      
                  $stmt = $this->conn->prepare("INSERT INTO users(user_name,birth,gender,image,job_title,curr_position,telephone,department,joining_date,user_email,user_pass,box_number,residence,nssf_number,bank_account,passport_number,home_district,village,nationality,work_permit) 
                                                             VALUES(:uname,:age,:sex,:image,:dpart,:joind,:job,:uposition,:phone,:umail,:upass,:unumber,:nssf,:bank,:passp,:home,:village,:nation,:permit)");
      
                  $stmt->bindparam(":uname",$uname);
                  $stmt->bindparam(":age",$age);
                  $stmt->bindparam(":sex",$sex);
                  $stmt->bindparam(":image",$image);
                  $stmt->bindparam(":dpart",$dpart);
                  $stmt->bindparam(":joind",$joind);
                  $stmt->bindparam(":job",$job);
                  $stmt->bindparam(":uposition",$uposition);
                  $stmt->bindparam(":phone",$phone);
                  $stmt->bindparam(":umail",$umail);
                  $stmt->bindparam(":upass",$new_password);
                  $stmt->bindparam(":unumber",$unumber);
                  $stmt->bindparam(":address",$address);
                  $stmt->bindparam(":nssf",$nssf);
                  $stmt->bindparam(":bank",$bank);
                  $stmt->bindparam(":passp",$passp);
                  $stmt->bindparam(":home",$home);
                  $stmt->bindparam(":village",$village);
                  $stmt->bindparam(":nation",$nation);
                  $stmt->bindparam(":permit",$permit);
      
                  $stmt->execute();   
      
                  return $stmt;   
              }
              catch(PDOException $e)
              {
                  echo $e->getMessage();
              }               
          }
      
      尽可能保持函数参数和字段名之间的一致性,并且。。。有道理

      我的代码提案如下所示:

      $stmt->bindparam(":age", $age, PDO::PARAM_INT);
      

      谢谢大家的努力和投入我发现问题其实是这个:
      $stmt->bindParam(“userPass”,$newUserPassword,PDO::PARAM_STR); 必须将其更改为: $stmt->bindParam(“userPass”,$userPass,PDO::PARAM_STR); 我试图使用一个我没有定义的参数,因为我这样做: $newUserPassword=密码\u散列($userPass,密码\u默认值);
      所以我想在bindParameters中替换它…希望它能帮助其他人

      在查询中有19个占位符,并向语句中添加了20个值。您缺少
      :address
      (居住
      列)的占位符。您的sql中有19项,而bindparam中有20项s@MagnusEriksson我没有看到您对
      :address
      中缺少的一个的编辑。因为我在下面贴了一个答案,这是一个社区维基。我不想从中得到代表,也不应该从中得到任何代表。@Fred ii-我同意,这是公平的。对于否决我的问题的用户:请让我知道你否决的动机,以便我可以相应地更改我的答案。通过这种方式,我们可以共同为网站的持续改进做出贡献。非常感谢。
      <?php
      
      public function register(
          $userName
          , $birth
          , $gender
          , $image
          , $jobTitle
          , $currPosition
          , $telephone
          , $department
          , $joiningDate
          , $userEmail
          , $userPass
          , $boxNumber
          , $residence
          , $nssfNumber
          , $bankAccount
          , $passportNumber
          , $homeDistrict
          , $village
          , $nationality
          , $workPermit
      ) {
          try {
              $newUserPassword = password_hash($userPass, PASSWORD_DEFAULT);
      
              $stmt = $this->conn->prepare('INSERT INTO users (
                                                  user_name,
                                                  birth,
                                                  gender,
                                                  image,
                                                  job_title,
                                                  curr_position,
                                                  telephone,
                                                  department,
                                                  joining_date,
                                                  user_email,
                                                  user_pass,
                                                  box_number,
                                                  residence,
                                                  nssf_number,
                                                  bank_account,
                                                  passport_number,
                                                  home_district,
                                                  village,
                                                  nationality,
                                                  work_permit
                                              ) VALUES (
                                                  :user_name,
                                                  :birth,
                                                  :gender,
                                                  :image,
                                                  :job_title,
                                                  :curr_position,
                                                  :telephone,
                                                  :department,
                                                  :joining_date,
                                                  :user_email,
                                                  :user_pass,
                                                  :box_number,
                                                  :residence,
                                                  :nssf_number,
                                                  :bank_account,
                                                  :passport_number,
                                                  :home_district,
                                                  :village,
                                                  :nationality,
                                                  :work_permit
                                              )');
      
              $stmt->bindparam(":user_name", $userName, PDO::PARAM_STR);
              $stmt->bindparam(":birth", $birth, PDO::PARAM_INT);
              $stmt->bindparam(":gender", $gender, PDO::PARAM_STR);
              $stmt->bindparam(":image", $image, PDO::PARAM_STR);
              $stmt->bindparam(":job_title", $jobTitle, PDO::PARAM_STR);
              $stmt->bindparam(":curr_position", $currPosition, PDO::PARAM_STR);
              $stmt->bindparam(":telephone", $telephone, PDO::PARAM_STR);
              $stmt->bindparam(":department", $department, PDO::PARAM_STR);
              $stmt->bindparam(":joining_date", $joiningDate, PDO::PARAM_STR);
              $stmt->bindparam(":user_email", $userEmail, PDO::PARAM_STR);
              $stmt->bindparam(":user_pass", $newUserPassword, PDO::PARAM_STR);
              $stmt->bindparam(":box_number", $boxNumber, PDO::PARAM_INT);
              $stmt->bindparam(":residence", $residence, PDO::PARAM_STR);
              $stmt->bindparam(":nssf_number", $nssfNumber, PDO::PARAM_INT);
              $stmt->bindparam(":bank_account", $bankAccount, PDO::PARAM_STR);
              $stmt->bindparam(":passport_number", $passportNumber, PDO::PARAM_STR);
              $stmt->bindparam(":home_district", $homeDistrict, PDO::PARAM_STR);
              $stmt->bindparam(":village", $village, PDO::PARAM_STR);
              $stmt->bindparam(":nationality", $nationality, PDO::PARAM_STR);
              $stmt->bindparam(":work_permit", $workPermit, PDO::PARAM_STR);
      
              $stmt->execute();
      
              return $stmt;
          } catch (PDOException $e) {
              echo $e->getMessage();
          }
      }