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

Résolu/Fermé
HotSkill Messages postés 65 Date d'inscription mardi 1 janvier 2008 Statut Membre Dernière intervention 26 septembre 2010 - 10 oct. 2008 à 14:01
 Utilisateur anonyme - 14 oct. 2008 à 08:00
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>

24 réponses

Utilisateur anonyme
10 oct. 2008 à 15:04
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
Posotaz Messages postés 489 Date d'inscription samedi 23 juin 2007 Statut Membre Dernière intervention 19 juin 2011 225
11 oct. 2008 à 00:50
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
Utilisateur anonyme
11 oct. 2008 à 09:34
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
Utilisateur anonyme
11 oct. 2008 à 16:30
dans le cas qui nous interesse , ici

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

n'a pas la valeur true mais contient le mot de passe.
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
11 oct. 2008 à 16:47
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
Utilisateur anonyme
11 oct. 2008 à 16:58
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
Utilisateur anonyme
11 oct. 2008 à 17:31
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
Utilisateur anonyme
11 oct. 2008 à 18:23
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
Utilisateur anonyme
11 oct. 2008 à 22:41
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
Utilisateur anonyme
12 oct. 2008 à 09:08
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
HotSkill Messages postés 65 Date d'inscription mardi 1 janvier 2008 Statut Membre Dernière intervention 26 septembre 2010 1
12 oct. 2008 à 16:41
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
Utilisateur anonyme
12 oct. 2008 à 17:45
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
Utilisateur anonyme
13 oct. 2008 à 12:11
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
Utilisateur anonyme
13 oct. 2008 à 17:32
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
Utilisateur anonyme
13 oct. 2008 à 20:26
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
HotSkill Messages postés 65 Date d'inscription mardi 1 janvier 2008 Statut Membre Dernière intervention 26 septembre 2010 1
11 oct. 2008 à 02:33
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
HotSkill Messages postés 65 Date d'inscription mardi 1 janvier 2008 Statut Membre Dernière intervention 26 septembre 2010 1
11 oct. 2008 à 16:27
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
HotSkill Messages postés 65 Date d'inscription mardi 1 janvier 2008 Statut Membre Dernière intervention 26 septembre 2010 1
11 oct. 2008 à 16:43
donc tu dit qu il faudrait que je mette une valeur true ou début de mon script a chaque variable ?
0
HotSkill Messages postés 65 Date d'inscription mardi 1 janvier 2008 Statut Membre Dernière intervention 26 septembre 2010 1
11 oct. 2008 à 16:56
ok mais vu chu pas grand expert en php je comprend pas trop :s
0
HotSkill Messages postés 65 Date d'inscription mardi 1 janvier 2008 Statut Membre Dernière intervention 26 septembre 2010 1
11 oct. 2008 à 17:28
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
HotSkill Messages postés 65 Date d'inscription mardi 1 janvier 2008 Statut Membre Dernière intervention 26 septembre 2010 1
11 oct. 2008 à 17:33
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