【问题标题】:Erreur !: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined错误!:SQLSTATE [HY093]:无效参数号:未定义参数
【发布时间】:2022-08-05 08:09:01
【问题描述】:

我正在开发一个使用 PHP/MySQL 更新用户密码的程序。该表的标题为 \'utilisateurs\',包含几个字段:

• numero(自动递增);

• 身份(用户ID);

• motdepasse(密码)。

用户必须提供实际密码 ($ancienmdp) 并输入两次新密码($nouveaumdp1 和 $nouveaumdp2),然后提交表单。

这是我正在研究的程序的一部分,尽管我进行了调查,但我仍然没有找到任何解决方案:

//On récupère le mot de passe actuel et les deux nouveaux mots de passe entrés par l\'utilisateur.
        $ancienmdp = $_POST[\'ancienmdp\'];
        $nouveaumdp1 = $_POST[\'nouveaumdp1\'];
        $nouveaumdp2 = $_POST[\'nouveaumdp2\'];
        
        
        if ($nouveaumdp1 != $nouveaumdp2) { //Si les deux nouveaux mots de passe ne correspondent pas...
                
            //... un message d\'erreur s\'affiche pour indiquer que les deux nouveaux mots de passe ne correspondent pas.
            $message = \'<p class=\"normal\">Le nouveau mot de passe et sa confirmation ne correspondent pas ! Veuillez taper à nouveau votre nouveau mot de passe.</p>\';
            
        } else { //Si les deux nouveaux mots de passe correspondent...
            
            //On recherche le mot de passe actuel de l\'utilisateur.
            $identifiantrecherche = $_SESSION[\'identifiant\'];
            
            $q= $dbco->prepare(\"SELECT motdepasse FROM `utilisateurs` WHERE identifiant=?\");
            $q->execute([$identifiantrecherche]);
            $actuelmdp = $q->fetchColumn();
            
            if ($ancienmdp != $actuelmdp) { //Si le mot de passe actuel entré ne correspond pas à celui déjà enregistré...
                
                //... un message d\'erreur indique que le mot de passe actuel n\'est pas valide.
                $message = \'<p class=\"normal\">Mot de passe actuel invalide ! Veuillez taper à nouveau vos actuel et nouveau mots de passe.</p>\';

                
            } else { //S\'ils correspondent bien...
                
                
                //... on met à jour le mot de passe de l\'utilisateur...
                $sth = $dbco->prepare(\"UPDATE `utilisateurs` SET `motdepasse` = :nouveaumdp1 WHERE `identifiant` = :identifiantrecherche\");
                
                //echo \'$identifiant = \' . $identifiantrecherche . \' ; $motdepasse = \' . $nouveaumdp1;
                
                $sth->bindParam(\':identifiant\',$identifiantrecherche, PDO::PARAM_STR);
                $sth->bindParam(\':motdepasse\',$nouveaumdp1, PDO::PARAM_STR);
                $sth->execute();
                //... et on indique à ce dernier que son mot de passe a bien été modifié.
                $message = \'<p class=\"normal\">Mot de passe modifié !</p>\';
            } }

我得到错误:

\'Erreur !: SQLSTATE[HY093]: 参数号无效:参数是 没有定义的\'

\'motdepasse\' 字段必须更新,并且 \'identifiant\' 字段用于查找正确的用户。因此,我对这两个字段使用 bindParam。

我究竟做错了什么?

谢谢!

  • 好吧,您已经找到了如何在“某处”执行此操作,但有趣的是您执行的两个查询完全不同……将您的第一个查询与第二个查询进行比较,看看您能看到什么不同。
  • 该查询包含占位符:nouveaumdp1:identifiantrecherche。您需要在对bindParam() 的调用中使用相同的字符串。
  • @TimBrownlaw 感谢您的回复!实际上,第一个查询直接使用位置占位符而不是命名占位符获取实际密码。我不知道这两个查询必须以相同的方式陈述!我会在下面写下答案。再次感谢!
  • @Barmar 感谢您的回复。问题不在于占位符名称,而在于查询类型。答案现在在下面。
  • 您可以使用命名占位符,我强烈推荐它们。您只需在调用bindParam() 时保持一致并使用相同的名称,或者如果您将调用中的参数传递给execute(),则使用具有相同名称的关联数组。

标签: php sql bindparam


【解决方案1】:

感谢@TimBrownlaw,我用位置占位符表示第二个查询,就像第一个查询一样,而不是像我那样使用命名占位符。

第二个查询变为:

$sth = $dbco->prepare("UPDATE `utilisateurs` SET motdepasse=? WHERE identifiant=?");
                
$sth->execute([$nouveaumdp1,$identifiantrecherche]);

现在它起作用了!

感谢您的帮助和时间!

【讨论】:

  • 为什么不保留命名的占位符而只修复名称?
  • @Barmar 感谢您的评论!也许我累了,但我在列或变量名中看不到问题!
【解决方案2】:

bindParam() 中的占位符需要与查询中的占位符匹配。

$sth->bindParam(':identifiantrecherche',$identifiantrecherche, PDO::PARAM_STR);
$sth->bindParam(':nouveaumdp1',$nouveaumdp1, PDO::PARAM_STR);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 2012-04-15
    • 2020-03-18
    相关资源
    最近更新 更多