A-t-il un expert assé bon pour règler mon pb

Résolu
HotSkill Messages postés 70 Statut Membre -  
 giheller -
Bonjour,
voici mon code pour changer les mot de passe sur mon site mais le probleme il m affiche tout le temps :
Votre nom d'utilisateur et votre mot de passe ne correspondent pas à un utilisateur enregistré.
comme si le mot de passe et mon username ne serait pas dans ma base de donné mais pourtant il le sont et en plus sa change meme pas le mot de passe donc en bref a cause cette erreur rien ce passe.... :(

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>cahnger de mot passe</title>
</head>

<body>
<?php

// Définir le titre de la page et inclure l'en-tête de page
$titre_page = "Changer un mot de passe";
include ('menu.php');

if (isset($_POST['submit']))
{ // Traiter le formulaire

// connexion à la base de données
mysql_connect("localhost", "root", "");
mysql_select_db("ma base");

// créer une variable vide
$message = NULL;

// Vérifier la présence d'un nom d'utilisateur

if (empty($_POST['nom_d_utilisateur']))

{ $u = FALSE;

$message .= '<p>Vous avez oublié d\'indiquer votre nom
d\'utilisateur</p>';

}
else
{ $u = ($_POST['nom_d_utilisateur']);
}

// Vérifier l'existence de l'ancien mot de passe
if (empty($_POST['mot_de_passe']))
{

$mp = FALSE;

$message .= "<p>Vous avez oublié d'indiquer votre ancien mot de
passe</p>";
}

else
{

$mp = ($_POST['mot_de_passe']);

}

// Vérifier l'existence d'un nouveau mot de passe
if (empty($_POST['mot_de_passe1']))
{

$np = FALSE;

$message .= "<p>Vous avez oublié d'indiquer votre nouveau mot de
passe</p>";
}

else
{ if ($_POST['mot_de_passe1'] == $_POST['mot_de_passe2'])

{

$np = ($_POST['mot_de_passe1']);

}

else

{

$np = FALSE;

$message .= "<p>Votre second mot de passe est différent de ".
"celui que vous venez de saisir</p>";
}
}

if ($u && $mp && $np)
{

$u = mysql_real_escape_string(htmlspecialchars($_POST['nom_d_utilisateur']));
$mp = mysql_real_escape_string(htmlspecialchars($_POST['mot_de_passe']));
$mp = md5($_POST["mot_passe"]);
$np = mysql_real_escape_string(htmlspecialchars($_POST['mot_de_passe1']));
$np = md5($_POST["mot_passe1"]);
$np = mysql_real_escape_string(htmlspecialchars($_POST['mot_de_passe2']));
$np = md5($_POST["mot_passe2"]);

$rq = "SELECT id_utilisateur FROM utilisateurs
WHERE (nom_d_utilisateur= '$u' AND mot_de_passe= '$mp')";
$result = mysql_query($rq);
$nb = mysql_num_rows($result) ;
if ($nb == 1)
{ $ligne = mysql_fetch_array($result, MYSQL_NUM);

// Créer la requête
$rq = "UPDATE utilisateurs SET mot_de_passe= '$np'
WHERE id_utilisateur=$ligne[0]";
$result = mysql_query($rq);
if (mysql_affected_rows() == 1) // Si c'est OK
{ // Envoyer éventuellement un e-mail
echo "<p><b>Votre mot de passe vient d'être
modifié.</b></p>";
include ('pied.php'); // inclure le pied de page
exit(); // terminer le script
}
else // il y a eu un problème
{ echo "<p>Votre nouveau mot de passe n'a pas pu être modifié
".
"à cause d'une erreur système :
<p></p>".mysql_error()."<p></p>";
}
}
else
{ $message .= "<p>Votre nom d'utilisateur et votre mot de passe
ne".
" correspondent pas à un utilisateur
enregistré.</p>";
}
// refermer la connexion avec la base de données
mysql_close();
}
else
{ // Quelque chose n'est pas correct
$message .= "<p>Veuillez avoir l'obligeance de recommencer</p>";
}
}

// Afficher éventuellement un ou plusieurs messages d'erreur
if (isset($message))
{ echo "<font color='red'>$message</font>";
}
?>

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<fieldset>
<legend>Veuillez remplir le formulaire ci-dessous :</legend>

<p><b>Nom d'utilisateur :</b>
<input type="text" name="nom_d_utilisateur" size="10" maxlength="20"
value="<?php if (isset($_POST['nom_d_utilisateur']))
echo $_POST['nom_d_utilisateur']; ?>"/>
</p>

<p><b>Mot de passe actuel :</b>
<input type="password" name="mot_de_passe" size="20" maxlength="20" />
</p>

<p><b>Nouveau mot de passe :</b>
<input type="password" name="mot_de_passe1" size="20" maxlength="20" />
</p>

<p><b>Confirmez votre nouveau mot de passe :</b>
<input type="password" name="mot_de_passe2" size="20" maxlength="20" />
</p>
</fieldset>

<div align="center">
<input type="submit" name="submit" value="Changer mon mot de passe" />
</div>

</form><!-- Fin du formulaire -->

<?php
include ('pied.php'); // Inclure le pied de page
?>
</body>
</html>
Configuration: Windows Vista
Firefox 3.0.3

24 réponses

  • 1
  • 2
  1. giheller
     
    bonjour,
    personne n'est asez bon pour répondre--
    JL,  m'enfin c'est juste mon avis @+
    se faire aider, n'est pas faire faire son travail
    1
  2. Posotaz Messages postés 505 Statut Membre 226
     
    Salut,

    Je soupçonne la méthode mysql_real_escape_string(htmlspecialchars($chaine)) de faire une conversion inappropriée par rapport à ce qui est réellement stocké dans la table de la base de données. Le htmlspecialchars est-il réellement nécessaire ?

    Le mieux c'est d'aller rechercher en DB la ligne qui correspond aux infos de l'utilisateur (via ton MySqlAdmin) et d'afficher $u et $mp (par la commande "echo" dans ton PHP)... ainsi tu pourras comparer les deux x2 chaines et confirmer (ou pas) le fait que ce sont tes méthodes d'échappement qui posent problème.
    1
  3. giheller
     
    Bonjour,

    Je pense qu'il y a un soucis au niveau du mote de passe ou plutoy de la variable $mp qui est une fois une variable booléenne (true false) et ensuite tu y mets le mot de passe entré.
    ------------------
    $mp = FALSE;
    $message .= "<p>Vous avez oublié d'indiquer votre ancien mot de
    passe</p>";
    }
    else
    {
    $mp = ($_POST['mot_de_passe']);
    ----------------------
    ensuite tu testes
    if ($u && $mp && $np)

    alors $mp c'est quoi, si tu y as mis un mot de passe c'est if (isset($mp)) qu'il faut mettre

    ou alors utilises un autre nom de varaible.
    1
  4. giheller
     
    dans le cas qui nous interesse , ici

    if ($u && $mp && $np)

    n'a pas la valeur true mais contient le mot de passe.
    1
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. giheller
     
    Non, je situe l'erreur et la cause de l'erreur. après tu vois comment palier le soucis.

    je pense sincèrement que ton script pourrait être simplifié et beaucoup plus lisible en le structurant autrement de manière à eviter tous ces if else et toutes ces variables booléennes.

    un exemple de modification
    comme tu le fais un peu tu testes toutes les erreurs (en diminuant les else) et quand il y en une tu créées une variables $message
    quand tu trouve une erreur tu mets $erreur=true;
    quand tu as tout testé, tu fais if ($erreur) echo $message;
    else {
    et là tu fais ton traitement
    }

    1
  7. giheller
     
    une autre piste,

    si tu regardes ton code en l'identant (ce que l'on ne voit pas sur cette page) on a :
    if ($u && $mp && $np) {
    $u = mysql_real_escape_string(htmlspecialchars($_POST['nom_d_utilisateur']));
    $mp = mysql_real_escape_string(htmlspecialchars($_POST['mot_de_passe']));
    $mp = md5($_POST["mot_passe"]);
    $np = mysql_real_escape_string(htmlspecialchars($_POST['mot_de_passe1']));
    $np = md5($_POST["mot_passe1"]);
    $np = mysql_real_escape_string(htmlspecialchars($_POST['mot_de_passe2']));
    $np = md5($_POST["mot_passe2"]);
    $rq = "SELECT id_utilisateur FROM utilisateurs
    WHERE (nom_d_utilisateur= '$u' AND mot_de_passe= '$mp')";
    $result = mysql_query($rq);
    $nb = mysql_num_rows($result) ;
    if ($nb == 1)
    { $ligne = mysql_fetch_array($result, MYSQL_NUM);
    // Créer la requête
    $rq = "UPDATE utilisateurs SET mot_de_passe= '$np'
    WHERE id_utilisateur=$ligne[0]";
    $result = mysql_query($rq);
    if (mysql_affected_rows() == 1) // Si c'est OK
    { // Envoyer éventuellement un e-mail
    echo "<p><b>Votre mot de passe vient d'être
    modifié.</b></p>";
    include ('pied.php'); // inclure le pied de page
    exit(); // terminer le script
    }
    else // il y a eu un problème
    { echo "<p>Votre nouveau mot de passe n'a pas pu être modifié
    ".
    "à cause d'une erreur système :
    <p></p>".mysql_error()."<p></p>";
    }
    }
    else
    { $message .= "<p>Votre nom d'utilisateur et votre mot de passe
    ne".
    " correspondent pas à un utilisateur
    enregistré.</p>";
    }
    // refermer la connexion avec la base de données
    mysql_close();
    }
    else
    { // Quelque chose n'est pas correct
    $message .= "<p>Veuillez avoir l'obligeance de recommencer</p>";
    }

    on s'aperçoit que le message est affiché quand
    $nb est différent de 1 alors n'as-tu pas oublié de mettre une protection pour empêcher qu'un utilisateur soit en double ?
    1
  8. giheller
     
    il n'est pas dur pourtant, on teste les erreurs puis on valide ou pas.
    il en exsiet des plus simples sur le net.
    1
  9. giheller
     
    si tu mets dans ta base deux utilisateurs de même nom et même mot de passe la requete renvoie 2 lignes et dons nb n'est pas == 1 mais égal à deux

    dont soit tu crées un index dans ta bdd ou tu vérifies que l'utilisateur n'est pas déjà enregistré;
    1
  10. giheller
     
    Bon alors le problème est ailleurs.

    une solution serait de mettre tout en commentaires, puis de décommenter au fur et à meusre des tests pour essayer de trouver l'endroit où cela commence à ne plus aller;
    1
  11. giheller
     
    bonjour,
    on rattaque ce matin.
    j'ai créé une table chez moi pour voir et bien j'ai trouvé des choses étranges

    ici :
    $mp = md5($_POST["mot_passe"]);
    $np = mysql_real_escape_string(htmlspecialchars($_POST['mot_de_passe1']));
    $np = md5($_POST["mot_passe1"]);
    $np = mysql_real_escape_string(htmlspecialchars($_POST['mot_de_passe2']));
    $np = md5($_POST["mot_passe2"]);

    dans le $_POST c'est pas les bons noms
    c'est mot_de_passe
    mot_de_passe1
    mot_de_passe2


    1
    1. HotSkill Messages postés 70 Statut Membre 1
       
      ok merci mais re voila mon code avec de meilleur nom de variable et mieux coder pour toi mais jai tourjours le meme message d erreur

      regarde ces image

      http://img2.hostingpics.net/pics/314054pbphp.jpg --------> screenshot de l erreur
      http://img2.hostingpics.net/pics/210829pbphp2.jpg ------ > screenshot de ma base de donné

      Nom de ma base : ma base
      Nom de ma table : utilisateurs

      revoici mon code retapés

      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      <title>cahnger de mot passe</title>
      </head>

      <body>

      <?php

      $titre_page = "Changer un mot de passe";
      include('menu.php');

      if (isset($_POST['submit']))
      { // Traiter le formulaire

      // connexion à la base de données
      mysql_connect("localhost", "root", "");
      mysql_select_db("ma base");

      // créer une variable vide
      $message = NULL;

      // Vérifier la présence d'un nom d'utilisateur

      if (empty($_POST['nom_d_utilisateur']))
      {
      $u = FALSE;
      $message .= '<p>Vous avez oublié d\'indiquer votre nom d\'utilisateur</p>';
      }
      else
      {
      $u = ($_POST['nom_d_utilisateur']);
      }

      // Vérifier l'existence de l'ancien mot de passe
      if (empty($_POST['mot_passe']))
      {
      $mp = FALSE;
      $message .= "<p>Vous avez oublié d'indiquer votre ancien mot de passe</p>";
      }
      else
      {
      $mp = ($_POST['mot_passe']);
      }

      // Vérifier l'existence d'un nouveau mot de passe
      if (empty($_POST['mot_passe1']))
      {
      $np = FALSE;
      $message .= "<p>Vous avez oublié d'indiquer votre nouveau mot de
      passe</p>";
      }
      else
      {

      if($_POST['mot_passe1'] == $_POST['mot_passe2'])
      {
      $np = ($_POST['mot_passe1']);
      }
      else
      {
      $np = FALSE;
      $message .= "<p>Votre second mot de passe est différent de celui que vous venez de saisir</p>";
      }
      }

      if ($u && $mp && $np)
      {
      $u = mysql_real_escape_string($_POST['nom_d_utilisateur']);
      $mp = mysql_real_escape_string(md5($_POST['mot_passe']));
      $np = mysql_real_escape_string(md5($_POST['mot_passe1']));
      $np = mysql_real_escape_string(md5($_POST['mot_passe2']));

      $check_if_exist = mysql_query('SELECT count(*) as if_exist FROM utilisateurs WHERE nom_d_utilisateur="'.$u.'" AND mot_de_passe="'.$mp.'"');
      $rep_if_exist = mysql_fetch_array($check_if_exist);

      if($rep_if_exist['if_exist']==1)
      {

      $query = mysql_query('SELECT id_utilisateur FROM utilisateurs WHERE nom_d_utilisateur="'.$u.'" AND mot_de_passe="'.$mp.'"');
      $ligne = mysql_fetch_array($query);

      // Créer la requête
      $rq = "UPDATE utilisateurs SET mot_de_passe='".$np1."'
      WHERE id_utilisateur='".$ligne['id_utilisateur']."'";
      $result = mysql_query($rq);

      if($result) // Si c'est OK
      { // Envoyer éventuellement un e-mail
      echo "<p><b>Votre mot de passe vient d'être modifié.</b></p>";
      include ('pied.php'); // inclure le pied de page
      exit(); // terminer le script
      }
      else // il y a eu un problème
      {
      echo "<p>Votre nouveau mot de passe n'a pas pu être modifié à cause d'une erreur système : <p></p>".mysql_error()."<p></p>";
      }
      }
      else
      {
      $message .= "<p>Votre nom d'utilisateur et votre mot de passe ne correspondent pas à un utilisateur enregistré.</p>";
      }
      // refermer la connexion avec la base de données
      mysql_close();
      }
      else
      { // Quelque chose n'est pas correct
      $message .= "<p>Veuillez avoir l'obligeance de recommencer</p>";
      }
      }

      // Afficher éventuellement un ou plusieurs messages d'erreur
      if(isset($message))
      {
      echo "<font color='red'>$message</font>";
      }
      ?>

      <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
      <fieldset>
      <legend>Veuillez remplir le formulaire ci-dessous :</legend>

      <p><b>Nom d'utilisateur :</b>
      <input type="text" name="nom_d_utilisateur" size="10" maxlength="20"
      value="<?php if (isset($_POST['nom_d_utilisateur']))
      echo $_POST['nom_d_utilisateur']; ?>"/>
      </p>

      <p><b>Mot de passe actuel :</b>
      <input type="password" name="mot_passe" size="20" maxlength="20" />
      </p>

      <p><b>Nouveau mot de passe :</b>
      <input type="password" name="mot_passe1" size="20" maxlength="20" />
      </p>

      <p><b>Confirmez votre nouveau mot de passe :</b>
      <input type="password" name="mot_passe2" size="20" maxlength="20" />
      </p>
      </fieldset>

      <div align="center">
      <input type="submit" name="submit" value="Changer mon mot de passe" />
      </div>
      </form><!-- Fin du formulaire -->

      <?php
      include ('pied.php'); // Inclure le pied de page
      ?>
      </body>
      </html>
      0
  12. giheller
     
    y aun truc là
    f ($u && $mp && $np)
    {
    $u = mysql_real_escape_string($_POST['nom_d_utilisateur']);
    $mp = mysql_real_escape_string(md5($_POST['mot_passe']));
    $np = mysql_real_escape_string(md5($_POST['mot_passe1']));
    $np = mysql_real_escape_string(md5($_POST['mot_passe2']));

    la dernière ligne c'est plutôt :
    $np1 = mysql_real_escape_string(md5($_POST['mot_passe2']));

    JL,  m'enfin c'est juste mon avis @+
    se faire aider, n'est pas faire faire son travail
    1
  13. giheller
     
    post sciptum

    j'ai fait tourner le pgm chez moi, c'est Ok.
    j'ai fait seulement quelques adaptations (nom de table ...) par rapport au dernier source communiqué.
    1
  14. giheller
     
    je ne comprends pas ton truc, car dans l'image de la table que tu m'as montrée hier, le mot de passe est codé.

    mais si tu pense que c'est ça c'est à l'enregistrement de l'utlisatuer qu'il faut le faire.

    dans le formulaire d'inscription tu récupères le mdpw, tu le codes et tu le mets en base.
    1
  15. giheller
     
    Bonsoir,

    Je ne comprends toujots pas. si le mote de passe est correct cela doit passer.
    J'ai réussi à le faire chez moi.

    un autre truc
    à quoi sert cetet double vérification (à mon avis inutile)
    on compte
    $check_if_exist = mysql_query('SELECT count(*) as if_exist FROM utilisateurs WHERE nom_d_utilisateur="'.$u.'" AND mot_de_passe="'.$mp.'"');
    $rep_if_exist = mysql_fetch_array($check_if_exist);

    if($rep_if_exist['if_exist']==1)
    {
    et si il y en a un on le lit
    $query = mysql_query('SELECT id_utilisateur FROM utilisateurs WHERE nom_d_utilisateur="'.$u.'" AND mot_de_passe="'.$mp.'"');
    $ligne = mysql_fetch_array($query);

    pourquoi ne pas le lire de suite et si la requête en renvoit 1 c'est OK
    1
  16. HotSkill Messages postés 70 Statut Membre 1
     
    Bonjour,
    Merci de ton aide mais malheuresement ce n'est pas ca meme si jai enlevé mysql_real_escape_string(htmlspecialchars($chaine))
    cela n'a pas fonctionner
    0
  17. HotSkill Messages postés 70 Statut Membre 1
     
    pour tant dans ma page d enregistrement je fait comme ça et sa marché tres bien je verrais pas pourquoi la dans mon script pour changer de mot de passe sa ne marcherais pas
    0
  18. HotSkill Messages postés 70 Statut Membre 1
     
    donc tu dit qu il faudrait que je mette une valeur true ou début de mon script a chaque variable ?
    0
  19. HotSkill Messages postés 70 Statut Membre 1
     
    ok mais vu chu pas grand expert en php je comprend pas trop :s
    0
  20. HotSkill Messages postés 70 Statut Membre 1
     
    Mais a vrai c pcq j ai prit se code dans un livre je ne le comprend pas beaucoup car moi aussi je le trouve compliqué mais c le seul code que j ai ....
    0
  21. HotSkill Messages postés 70 Statut Membre 1
     
    comme que tu a cité préceédament que veut tu dire par tu as oublié de mettre une protection pour empêcher qu'un utilisateur soit en double

    une autre piste,

    si tu regardes ton code en l'identant (ce que l'on ne voit pas sur cette page) on a :
    if ($u && $mp && $np) {
    $u = mysql_real_escape_string(htmlspecialchars($_POST['nom_d_utilisateur']));
    $mp = mysql_real_escape_string(htmlspecialchars($_POST['mot_de_passe']));
    $mp = md5($_POST["mot_passe"]);
    $np = mysql_real_escape_string(htmlspecialchars($_POST['mot_de_passe1']));
    $np = md5($_POST["mot_passe1"]);
    $np = mysql_real_escape_string(htmlspecialchars($_POST['mot_de_passe2']));
    $np = md5($_POST["mot_passe2"]);
    $rq = "SELECT id_utilisateur FROM utilisateurs
    WHERE (nom_d_utilisateur= '$u' AND mot_de_passe= '$mp')";
    $result = mysql_query($rq);
    $nb = mysql_num_rows($result) ;
    if ($nb == 1)
    { $ligne = mysql_fetch_array($result, MYSQL_NUM);
    // Créer la requête
    $rq = "UPDATE utilisateurs SET mot_de_passe= '$np'
    WHERE id_utilisateur=$ligne[0]";
    $result = mysql_query($rq);
    if (mysql_affected_rows() == 1) // Si c'est OK
    { // Envoyer éventuellement un e-mail
    echo "<p><b>Votre mot de passe vient d'être
    modifié.</b></p>";
    include ('pied.php'); // inclure le pied de page
    exit(); // terminer le script
    }
    else // il y a eu un problème
    { echo "<p>Votre nouveau mot de passe n'a pas pu être modifié
    ".
    "à cause d'une erreur système :
    <p></p>".mysql_error()."<p></p>";
    }
    }
    else
    { $message .= "<p>Votre nom d'utilisateur et votre mot de passe
    ne".
    " correspondent pas à un utilisateur
    enregistré.</p>";
    } // refermer la connexion avec la base de données
    mysql_close();
    }
    else
    { // Quelque chose n'est pas correct
    $message .= "<p>Veuillez avoir l'obligeance de recommencer</p>";
    }

    on s'aperçoit que le message est affiché quand
    $nb est différent de 1 alors n'as-tu pas oublié de mettre une protection pour empêcher qu'un utilisateur soit en double ?
    0
  • 1
  • 2