Script pour changer le mot de passe d'un utilisateur enregistre

Le
Apollon
Bonjour,
j'utilise ce script pour permettre à un utilisateur déjà enregistré
de modifier son mot de passe.
Il y a deux idées là dedans :
comparaison d'un nom d'utilisateur et d'un mot de passe saisis par un
utilisateur avec des valeurs précédemment enregistrées,
mise à jour d'enregistrements en utilisant la clé primaire comme
point de référence.
Le script ne marche pas et j'arrive pas à trouver l'origine du
problème. En fait cette parie du script conduit à $nb=0 (on s'attend
à $nb=1):

if ($u && $mp && $np)
{ $rq = "SELECT id_utilisateur FROM utilisateurs
WHERE (nom_utilisateur= '$u' AND mot_de_passe=PASSWORD('$mp'))";
$result = mysql_query($rq);
$nb = mysql_num_rows($result);
if ($nb == 1)
/*c'est qu'il existe bien un utilisateur répondant aux
critères définis. On récupère le paramètre id_utilisateur dans
l'élément de tableau $ligne[0] par : */
{ $ligne = mysql_fetch_array($result, MYSQL_NUM);

// On peut alors lancer un requête de modification par :

$rq = "UPDATE utilisateurs SET mot_de_passe=PASSWORD('$np')
WHERE id_utilisateur=$ligne[0]";
$result = mysql_query($rq);
if (mysql_affected_rows() == 1)
// Si c'est OK, la modification a réussi




ce qui donne toujours l'avertissement inclus dans le script : "Votre
nom d'utilisateur et votre mot de passe ne correspondent pas à un
utilisateur enregistré."

Merci beaucoup de votre aide.


Voici le listing complet du script

<?php

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

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

// Créer une fonction pour échapper les données.
function echappement ($data)
{ global $bd; // connexion nécessaire
if (ini_get('magic_quotes_gpc'))
{ $data = stripslashes($data);
}
return mysql_escape_string($data);
} // fin de la fonction

// connexion à la base de données
require_once ('modeles/mysql_connect-1.php');
// créer une variable vide
$message = NULL;
// Vérifier la présence d'un nom d'utilisateur
if (empty($_POST['nom_utilisateur']))
{ $u = FALSE;
$message .= '<p>Vous avez oublié d'indiquer votre nom
d'utilisateur</p>';
}
else
{ $u = echappement($_POST['nom_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 = echappement($_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 = echappement($_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)
{ $rq = "SELECT id_utilisateur FROM utilisateurs
WHERE (nom_utilisateur= '$u' AND mot_de_passe=PASSWORD('$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=PASSWORD('$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 ('modeles/pied_page.inc'); // 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 : $1$
<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 renseigner le formulaire ci-dessous :</legend>

<p><b>Nom d'utilisateur :</b>
<input type="text" name="nom_utilisateur" size="10" maxlength="20"
value="<?php if (isset($_POST['nom_utilisateur']))
echo $_POST['nom_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 ('modeles/pied_page.inc'); // Inclure le pied de page
?>

  • Partager ce contenu :
Vos réponses
Trier par : date / pertinence
P'tit Marcel
Le #104406
j'utilise ce script pour permettre à un utilisateur déjà enregistré
de modifier son mot de passe.

Le script ne marche pas et j'arrive pas à trouver l'origine du
problème. En fait cette parie du script conduit à $nb=0 (on s'attend
à $nb=1):



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


pas idéal du fait des approximation de conversion silencieuse en booléen
ça c'est mieux:
if(($u <> '') and ($mp <> '') and ($np <> ''))


{ $rq = "SELECT id_utilisateur FROM utilisateurs
WHERE (nom_utilisateur= '$u' AND mot_de_passe=PASSWORD('$mp'))";
$result = mysql_query($rq);


un petit test d'échec ne fait de mal à personne, rajoute :
if(!$result) die('erreur technique n° xxx');

$nb = mysql_num_rows($result);
if ($nb == 1)
/*c'est qu'il existe bien un utilisateur répondant aux
critères définis. On récupère le paramètre id_utilisateur dans
l'élément de tableau $ligne[0] par : */
{ $ligne = mysql_fetch_array($result, MYSQL_NUM);

// On peut alors lancer un requête de modification par :

$rq = "UPDATE utilisateurs SET mot_de_passe=PASSWORD('$np')
WHERE id_utilisateur=$ligne[0]";


si la colonne id_utilisateur est alphanumérique alors la valeur doit
être entre cotes, il faut :

$rq = "UPDATE utilisateurs SET mot_de_passe=PASSWORD('$np')
WHERE id_utilisateur='$ligne[0]'";


$result = mysql_query($rq);


un petit test d'échec ne fait de mal à personne, rajoute :
if(!$result) die('erreur technique n° zzz');




En fait cette parie du script conduit à $nb=0 (on s'attend
à $nb=1):
ce qui donne toujours l'avertissement inclus dans le script : "Votre
nom d'utilisateur et votre mot de passe ne correspondent pas à un
utilisateur enregistré."


à mon avis, le problème ne vient pas du script mais du contenu de la
table utilisateurs. La colonne mot_de_passe fait moins de 16 caractères,
ou les mots de passe ont été cryptés (fonction PASSWORD) avec une
version ancienne de mysql, ou le nom d'utilisateur est trop long par
rapport à la taille maxi de la colonne nom_utilisateur.



eça
--
P'tit Marcel
stats sur les forums modérés http://www.centrale-lyon.org/ng/

Publicité
Poster une réponse
Anonyme