Bonjour ! J'essaye de mettre en place un formulaire de changement de mot de passe dans mon espace membre, mais je reste bloquée depuis plusieurs jours... En effet, la page ne me renvoie pas d'erreur mais me dit renvoie, peut importe ce que j'entre, que la combinaison de ce login et de ce mot de passe n'existe pas dans la base de données. Voici mon code :

<form method="POST" action="testmodifmdp.php">
<input type="text" label="Identifiant" name="login" placeholder="Entrez votre identifiant">
<br/>
<input type="password" label="Mot de passe" name="passA" placeholder="Ancien mot de passe">
<br/>
<input type="password" label="Mot de passe" name="passN1" placeholder="Nouveau mot de passe">
<br/>
<input type="password" label="Mot de passe" name="passN2" placeholder="Confirmation du nouveau mdp">
<br/>
<input type="submit" name="enregistrer" value="Connexion">
</form>

                <?php
                if(isset($_POST['enregistrer'])){
                    $passA=$_POST['passA'];
                    $passN1=$_POST['passN1'];
                    $passN2=$_POST['passN2'];
                    $login=$_POST['login'];

                    if (($passA!='')&&($passN1!='')&&($passN2!='')){ // on vérifie qu'aucun mot de passe n'est vide
                        if($passN1==$passN2){   // on vérifie que le nouveau mdp et sa confirmation correspondent
                            if((strlen($passN1)>5)&&(strlen($passN1))<16){  // on vérifie que le mot de passe fait entre 6 et 15 caractères
                                $q="SELECT * FROM utilisateurs WHERE login='$login' AND mdp='$passA'"; // on récupère le(s) utilisateur(s) dont le login et le mdp correspondent au login et l'ancien mdp entrés
                                $res=$connect->query($q);
                                $data=mysqli_fetch_array($res);
                                if($data->num_rows!=0){ // s'il y a une réponse
                                    $q2="UPDATE utilisateurs SET mdp='$passN1' WHERE login='$login' AND mdp='$passA'"; // on modifie le mdp
                                    $res2=$connect->query($q2);
                                    if($res2){
                                        echo "Modification du mot de passe effectuée avec succès";
                                    } else if($connect->error){
                                        echo "La modification a échoué : ".$connect->error;
                                    }
                                } else { // s'il n'y a pas d'utilisateur dont le login & le mdp rentrés correspondent
                                    echo "La combinaison de cet identifiant et de ce mot de passe n'existe pas. Veuillez réessayer.";
                                }
                            } else { // si le mot de passe fait entre 6 et 15 caractères
                                echo "Le nouveau mot de passe doit contenir entre 6 et 15 caractères.";
                            }
                        } else { // si le nouveau mdp et sa confirmation ne correspondent pas
                            echo "Erreur entre le nouveau mot de passe entré et la vérification";
                        }
                    } else { // si un des champs est vide
                        echo "Vous devez remplir les champs ci-dessus.";
                    }
                }
                ?>

Pourriez-vous m'aider s'il vous plait ?

7 réponses


Bonjour,

$data=mysqli_fetch_array($res);

Ceci est du procédural alors que vous utiliser de l'objet pour votre page. Tandis que :

$data = $res->fetch()

correspondra à de l'objet.

camlec
Auteur

Merci pour votre réponse Carouge10, j'ai du mal avec l'objet... Par contre j'ai toujours le même problème alors que ma requête me paraît bonne...

De même pour $data->num_rows!=0 qui est incorect.
$res->rowCount() est le plus approprié.

Grafikart viens de publier un tutoriels sur la POO, je pense que cela devrait vous aidez.

$passA, $passN1 et $passN2 correspondent à quoi concrètement ?
Pour un login normalement un seul mot de passe suffit ^^

Ensuite lorsque de l'inscription as-tu crypé le mot de passe (avec une clé SHA par exemple) ?

Je pene que $passA correspond à l'ancien mdp et que $passN1 et $passN2 sont respectivement le nouveau mdp et sa confirmation

D'où l'utilité d'utiliser des noms un minimum clairs. Là tu reviens dans 6 mois sur ton code tu seras paumé :/

Evites les $data aussi, sauf si, à la rigueur, dans une classe tu définies cette variable comme ne contenant spécifiquement que certaines informations.

Moi ce qui me choque c'est ça:

$q="SELECT * FROM utilisateurs WHERE login='$login' AND mdp='$passA'";
...
$q2="UPDATE utilisateurs SET mdp='$passN1' WHERE login='$login' AND mdp='$passA'";

le: "AND mdp = '$passA';

A moins que t'es mots de passes ne soient pas crypté (stocké en clair), ta requete ne fonctionnera jamais !