Problème de connexion - Prizor - 22-02-2007
Bonsoir.
Alors voilà, j'ai un script de connexion pour mon jeu (c'était le seul truc au point jusqu'à maintenant...:pleure2.
J'utilise la fonction md5 sur le mot de passe saisi (ainsi qu'à l'inscription).
Jusqu'à aujourd'hui, ça marchait, mais là, je sais pas ce que j'ai touché, ça me met toujours "mot de passe incorrect"...
Dans header.php, on trouve notamment un isset (pour la session), et la connexion à la bdd.
Dans footer.php, on trouve notamment la déconnexion de la bdd.
Donc rien de notable à ce niveau-là, je pense.
Voilà le code de la page index.php :
Code PHP : <?php
session_start();
$titre_page = 'Index';
include("header.php");
if ($_SESSION['logged'] == true) { echo'Vous êtes connecté.'; }
// Pour alléger un peu la page, j'ai viré le bout de code pour la connexion automatique (cookie)
// Ici on gère le formulaire de connexion
// Si la variable $_POST['connexion'] (bouton submit du formulaire) et la variable $_SESSION['logged'] vaut false (déconnecté) existent
if (isset($_POST['connexion']) && $_SESSION['logged'] == false)
{
// Vérification des autres variables
if (isset($_POST['pseudo'],$_POST['password']) && !empty($_POST['pseudo']) && !empty($_POST['password']))
{
// Vérification du pseudo
$pseudo = htmlspecialchars($_POST['pseudo']);
$password = $_POST['password'];
// Requête comptant le nombre de pseudos $_POST['pseudo']
$sql = mysql_query("SELECT COUNT(*) AS nb_pseudo FROM comptes WHERE pseudo='".$pseudo."'");
// Si le pseudo existe
if (mysql_result($sql,0,'nb_pseudo') == 1)
{
// Vérification du mot de passe
// Information sur le compte du membre
$sql_infos = mysql_query("SELECT id, password, confirmation FROM comptes WHERE id='".$donnees['id']."'");
$donnees = mysql_fetch_array($sql_infos);
// Hashage du mot de passe
$password_hash = md5($password);
echo''.$donnees[".password."].'<br />';
echo''.$password_hash.'<br />';
// Comparaison du mot de passe
if ($password_hash == $donnees['password'])
{
// On vérifie que le compte est confirmé
// Si $donnees['confirmation'] vaut 1
if ($donnees['confirmation'] == 1)
{
if (isset($_POST['souvenir']) && $_POST['souvenir'] == 'on')
{
// Temps d\'expiration des cookies (1 an)
$expire = time() + 3600 * 24 * 365;
setcookie('pseudo', $pseudo, $expire);
setcookie('password', $password_hash, $expire);
}
// Tout est bon, on connecte le membre
$_SESSION['logged'] = true;
// Création de 2 variables de session, contenant des informations sur le membre
$_SESSION['id'] = $donnees['id']; //Id du membre
$_SESSION['pseudo'] = $pseudo; //Pseudo du membre
echo'Vous êtes correctement identifié, <a href="stats.php">Stats</a>';
}
else
echo'Erreur : le compte n\'est pas confirmé.';
}
else
echo'Erreur : le mot de passe est incorrect.';
}
else
echo'Erreur : ce pseudo n\'existe pas.';
}
else
echo'Erreur : veuillez remplir tous les champs.';
}
if ($_SESSION['logged'] == false) {
echo'<table>
<form method="post" action="index.php">
<tr><td><label for="pseudo">Pseudo : </td><td><input type="text" name="pseudo" id="pseudo" /></label></td></tr>
<tr><td><label for="password">Mot de passe : </td><td><input type="password" name="password" id="password" /></label></td></tr>
<tr><td><label for="souvenir">Connexion automatique : </td><td><input type="checkbox" name="souvenir" id="souvenir" /></label></td></tr>
<tr><td align="center"><input type="submit" name="connexion" value="Connexion" /></td></tr>
</form>
</table>
Pas encore membre ? <a href="preinscription.php">S\'inscrire</a>
';
}
// Inclusion du footer
include("footer.php");
?>
Et voilà le code de la page inscription.php (pour vous montrer le hashage avec md5) :
Code PHP : <?php
session_start();
$titre_page = 'Inscription';
include("header.php");
//On vérifie que la variable $_POST['inscription'] existe
if (isset($_POST['inscription']))
{
//Si les variables contenant le pseudo, le mot de passe et l'email existent et contiennent quelque chose
if (isset($_POST['pseudo'], $_POST['password'], $_POST['email']) && !empty($_POST['pseudo']) && !empty($_POST['password']) && !empty($_POST['email']))
{
//Si le pseudo est supérieur à 3 caractères et inférieur à 35 caractères
if (strlen(trim($_POST['pseudo'])) > 3 && strlen(trim($_POST['pseudo'])) < 16)
{
//Si le mot de passe est supérieur à 4 caractères
if (strlen(trim($_POST['password'])) > 4)
{
//Mesure de sécurité
$pseudo = htmlspecialchars($_POST['pseudo']);
$password = htmlspecialchars($_POST['password']);
$email = htmlspecialchars($_POST['email']);
//On vérifie que le pseudo n'existe pas
$sql = mysql_query("SELECT COUNT(*) AS nb_pseudo FROM comptes WHERE pseudo='".$pseudo."'");
if (mysql_result($sql, 0, 'nb_pseudo') == 0)
{
//Hashage du mot de passe avec md5()
$password = md5($password);
//Génération du code de confirmation
$lettres_chiffres = 'abcdefghijklmnopqrstuvwxyz0123456789';
$lettres_chiffres_melanges = str_shuffle($lettres_chiffres);
$code_confirmation = substr($lettres_chiffres_melanges, 1, 10);
//Envoi du mail de confirmation
$message = '
Bonjour, '.$pseudo.'.
Blablabla';
//Si le mail a été envoyé on peut enregistrer le membre
if (mail($email, 'Confirmation de votre inscription', $message, 'sujet'))
{
// adresse ip:
$ip=$_SERVER['REMOTE_ADDR'];
// timestamp
$tmstp_register=time();
//On exécute la requête qui enregistre le nouveau membre:
mysql_query("INSERT INTO comptes (id, ip, pseudo, password, confirmation, email, confirmation_code, tmstp_register, tmstp_lastconnect) VALUES ('', '".$ip."', '".$pseudo."', '".$password."', '0', '".$email."', '".$code_confirmation."', '".$tmstp_register."', '".$tmstp_register."')");
print 'Merci de vous être enregistré(e), votre compte a bien été créé.<br />
Toutefois, votre compte requiert une activation.<br />
Un e-mail contenant un lien de confirmation de votre inscription vous a été envoyé, vous devriez le recevoir sous peu.';
print '<br /><br /><a href="index.php">Index</a>';
}
else
{
print 'Erreur : échec lors de l\'envoi du mail. Veuillez vous ré-inscrire.';
}
}
else
print 'Erreur : ce pseudo est déjà enregistré.';
}
else
print 'Erreur : le mot de passe est trop court.';
}
else
print 'Erreur : le pseudo est trop court ou trop long.';
}
else
print 'Erreur : tous les champs ne sont pas remplis.';
}
include("footer.php");
?>
Voilà, si vous avez des conseils (et je suis sûr que vous en avez plein, notamment pour alléger la page ou simplifier des requètes, ou quelques petites choses comme ça^^) n'hésitez pas, et surtout, dites-moi si vous trouvez pourquoi à l'identification j'obtiens toujours le message "mot de passe incorrect" !!
Merci d'avance !:respect:
RE: Problème de connexion - Raoull - 22-02-2007
Peut-être que c'est ici que ca coince :
Code PHP : <?php
// Vérification du mot de passe
// Information sur le compte du membre
$sql_infos = mysql_query("SELECT id, password, confirmation FROM comptes WHERE id='".$donnees['id']."'");
$donnees = mysql_fetch_array($sql_infos);
dans ta requète, le tableau $données sort d'ou ?? il n'apparait pas dans ton code avant ... ou peut être dans les lignes que tu as viré..
- id est un nombre, pas besoin des ' autour.
- si tu utilise que les tableaux associatif, utilise mysql_fetch_assoc au lieu de mysql_fetch_array
RE: Problème de connexion - Plume - 22-02-2007
J'ai un peu pas le courage de me jeter dans les erreurs qu'il y a peut être. Je te conseillerais quand même de faire quelques tests pour dépister l'erreur. Par exemple faire des echo des variables qui peuvent poser soucis. Ici, $password_hash & $donnees['password'] et voir si il n'y a pas un problème à ce niveau là. Bon évidemment que si, mais en voyant les différences, peut être que tu comprendras le problème
Bon débuggage
RE: Problème de connexion - Prizor - 22-02-2007
Raoull a écrit :dans ta requète, le tableau $données sort d'ou ?? il n'apparait pas dans ton code avant ... Euh...
Raoull a écrit :- id est un nombre, pas besoin des ' autour.
- si tu utilise que les tableaux associatif, utilise mysql_fetch_assoc au lieu de mysql_fetch_array Merci, ça fera au moins ça de gagné...
RE: Problème de connexion - Raoull - 22-02-2007
$données est créé après ta requète, avec un vilain mysql_fetch_array, mais la ligne d'avant DANS ta requète(ou tu récup le mot de passe de la bdd), tu utilise $donnees['id'] qui n'existe pas avant... C pas du chinois pourtant ce que je raconte.
Je serais toi, je regarderais de plus pres au lieu de faire "heu" car cette requete permet de de récup le fameux mot de passe, et comme tu ne vérifie pas si elle retourne un résultat (ou plusieurs ou zero)... mais que tout de suite apres tu cherches à comparer les mots de passe, c'est normal que ca foire exactement à ce niveau la ... vu qu'a mon avis ta requete retourne quedal.
Bon courage !
RE: Problème de connexion - Plume - 22-02-2007
Je viens de regarder & en effet, Raoull a raison. C'est le problème de PHP, il ne te dit rien quand tu utilises une variable non initialisé.
PHP Trop souple ? Peut être. En tout cas, corrige ça & ça devrait tourner
RE: Problème de connexion - Prizor - 23-02-2007
Raoull a écrit :Je serais toi, je regarderais de plus pres au lieu de faire "heu"
Je disais "euh..." pour dire "en effet, je crois que j'ai fais un peu n'importe quoi"...:heuuu:
Merci pour votre aide, j'ai changé 2 ou 3 trucs et maintenant ça marche.
RE: Problème de connexion - Raoull - 23-02-2007
tant mieux si ca marche !
Et t'inquiete, c'est moi qui était un peu trop succeptible hier, sorry
Probleme réglé, au suivant !
|