Problème connexion membre MySQL

Résolu/Fermé
Evan - Modifié le 31 mars 2019 à 13:40
 Utilisateur anonyme - 31 mars 2019 à 15:57
Bonjour,
Je doit faire un système de connexion de membres, j'ai réussi à gérer l'inscription mais je n'arrive pas à gérer la connexion (il n'arrive pas à comparer le mdp de la base de données et le mdp entré dans le formulaire car sur la page web il m'affiche "Mauvais identifiant ou mdp" qui est le message d'erreur seulement quand le mdp ou l'identifiant est faux.

Voici le code :

(je pense que cela vient du "execute array" avec les 2 variables )
mais je sais pas comment faire

 
//connexion


if(isset($_POST['pseudo1']) && $_POST['pseudo1'] == !null)
{
$req = $bdd->prepare('SELECT pseudo, mdp FROM infos_persos WHERE pseudo = :pseudo');
$req->execute(array(
'pseudo' => $_POST['pseudo1']));
$resultat = $req->fetch();


// Comparaison du pass envoyé via le formulaire avec la base
$isPasswordCorrect = password_verify($_POST['password1'], $resultat['mdp']);

if (!$resultat)
{
echo 'Mauvais identifiant ou mot de passe !';
}
else
{
if ($isPasswordCorrect)
{
session_start();
$_SESSION['pseudo'] = $resultat['pseudo'];
$_SESSION['pseudob'] = $_POST['pseudo1'];
echo 'Vous êtes connecté !';
}
else
{
echo 'Mauvais identifiant ou mot de passe !';
}
}

}




Merci beaucoup de votre aide ;) !


Configuration: Windows / Chrome 73.0.3683.86
A voir également:

3 réponses

yg_be Messages postés 23400 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 décembre 2024 Ambassadeur 1 557
31 mars 2019 à 14:12
bonjour,
peux-tu utiliser le type de code "php" quand tu partages du code php?
es-tu certain d'avoir bien enregistré le pseudo et le hash du mot de passe dans la base?
c'est une excellente idée, pour des raisons de sécurité, de renvoyer exactement le même message d'erreur pour un pseudo incorrect ou pour un mot de passe incorrect. cependant, cela complique un peu la recherche de l'erreur. peut-être veux-tu provisoirement renvoyer deux messages différents?
ce serait plus logique de faire ainsi, pour ne pas utiliser $resultat avant de vérifier qu'il était correct:
$resultat = $req->fetch();
if (!$resultat)
{
     echo 'Mauvais identifiant ou mot de passe !';
}
else
{
    // Comparaison du pass envoyé via le formulaire avec la base
    $isPasswordCorrect = password_verify($_POST['password1'], $resultat['mdp']);
    if ($isPasswordCorrect) 
0
vavan44360 Messages postés 2 Date d'inscription dimanche 31 mars 2019 Statut Membre Dernière intervention 31 mars 2019
31 mars 2019 à 14:45
Bonjour,

je n'avais pas prévu de faire deux messages d'erreur différents.
c'est un projet pour le bac donc pour le moment je ne hash pas le mot de passe.

j'ai inverser comme tu m'as dit :

if(isset($_POST['pseudo1']) && $_POST['pseudo1'] == !null)
{
    $req = $bdd->prepare('SELECT pseudo, mdp FROM infos_persos WHERE pseudo = :pseudo');
    $req->execute(array(
        'pseudo' => $_POST['pseudo1']));
    $resultat = $req->fetch();
        if (!$resultat)
    {
        echo 'Mauvais identifiant ou mot de passe1 !';
    }
    else
    {

    // Comparaison du pass envoyé via le formulaire avec la base
    $isPasswordCorrect = password_verify($_POST['password1'], $resultat['mdp']);


        if ($isPasswordCorrect) 
        {
            session_start();
            $_SESSION['pseudo'] = $resultat['pseudo'];
            $_SESSION['pseudo'] = $_POST['pseudo1'];
            echo 'Vous êtes connecté !';
        }
        else   
        {
            echo 'Mauvais identifiant ou mot de passe2 !';
        }
    }
        
}


Je pense avoir une erreur assez bête, car j'ai deux messages d'erreur "Mauvais identifiant ou mdp", j'ai rajouté un "1" et un "2" sur chaque message pour savoir lequel s'affiche.
ET quand je rentres le bon pseudo avec le bon mdp ou un mauvais mdp, j'ai le message d'erreur 2 qui s'affiche. Or quand je rentres un mauvais pseudo, j'ai le message d'erreur 1 qui s'affiche.
Je ne comprend pas.

Merci de votre aide
0
yg_be Messages postés 23400 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 décembre 2024 1 557 > vavan44360 Messages postés 2 Date d'inscription dimanche 31 mars 2019 Statut Membre Dernière intervention 31 mars 2019
Modifié le 31 mars 2019 à 14:57
si tu as enregistré le mot de passe en clair dans la base, alors utilise strcmp au lieu de password_verify.
tes lignes 21 et 22 sont bizarres: tu enregistres deux fois quasi la même chose au même endroit.
0
Utilisateur anonyme
31 mars 2019 à 14:42
Bonjour

if(isset($_POST['pseudo1']) && $_POST['pseudo1'] == !null)


Attention, tu testes si $_POST['pseudo1'] est égal à !null, ce qui n'est certainement pas le cas.
Tu voulais sûrement tester une différence, ce qui s'écrit avec !== :
if(isset($_POST['pseudo1']) && $_POST['pseudo1'] !== null)
0
vavan44360 Messages postés 2 Date d'inscription dimanche 31 mars 2019 Statut Membre Dernière intervention 31 mars 2019
31 mars 2019 à 14:46
bonjour, le but est de tester si la case est vide.
0
Utilisateur anonyme
31 mars 2019 à 15:57
Mais justement ton code ne teste pas si la case est vide. Je pense que tu n'as compris ni la différence entre null et vide, ni celle entre !== null et == !null. Déjà, ce n'est pas logique d'écrire !null, autant écrire true.
0
jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 717
31 mars 2019 à 15:32
Bonjour,

Voici le code corrigé :
<?php
//démarrage Session
session_start();

//affichage des erreurs php
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);


//connexion à la bdd ET activation des erreurs PDO
try{
	$bdd =new PDO('mysql:host=localhost;dbname=mabdd; charset=utf8', 'user', 'password');
	// Activation des erreurs PDO
	 $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
	// mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
	 $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch(PDOException $e) {
    die('Erreur : ' . $e->getMessage());
}




// Récupération PROPRE des variables AVANT de les utiliser
$pseudo = !empty($_POST['pseudo1']) ? trim($_POST['pseudo1']) : NULL;
$password1 = !empty($_POST['password1']) ? trim($_POST['password1']) : NULL;

//traitement ..
if($pseudo){
	//préparation de la requête et des variables
	 $sql = "SELECT pseudo, mdp FROM infos_persos WHERE pseudo = :pseudo";
	 $datas = array(':pseudo'=>$pseudo);
	//Execution de la requete
	try{
	  $requete = $bdd -> prepare($sql) ;
	  $requete->execute($datas) ;
	  $resultat = $requete->fetch();
	}catch(Exception $e){
	  // en cas d'erreur :
	   echo " Erreur ! ".$e->getMessage();
	   echo " Les datas : " ;
	  print_r($datas);
	}

	if (!$resultat){
	   echo 'Pseudo inconnu  !';
	}else{
		// Comparaison du pass envoyé via le formulaire avec la base
		$isPasswordCorrect = password_verify($password1, $resultat['mdp']);
		if ($isPasswordCorrect){
			$_SESSION['pseudo'] = $resultat['pseudo'];
			$_SESSION['pseudob'] = $_POST['pseudo1'];
			echo 'Vous êtes connecté !';
		}else{
		  echo 'Mauvais identifiant ou mot de passe !';
		}
	}
}else{
  echo "Merci de renseigner un Pseudo !";
}




Comme tu peux le voir, j'ai appliqué le contenu de ces deux liens :
https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code
https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs

Je t'invite à en faire de même à l'avenir.


PS: ce code ne fonctionnera qu'à condition que tu aies bien enregistré le mot de passe de l'utilisateur via la fonction password_hash.


0