【发布时间】: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(),则使用具有相同名称的关联数组。