8722 sujets

Développement web côté serveur, CMS

Pages :
Bonjour à tous,

J'ai un problème pour un script de connexion d'un membre à la ma bdd.

<?php
	try
	{
		$bdd = new PDO('mysql:host=localhost;dbname=Fontlist', 'root', 'root');
	}
	catch (Exception $e)
	{
	        die('Erreur : ' . $e->getMessage());
	}

	$login =isset($_POST['login']) ? $_POST['login']: '';
	$password = isset($_POST['password']) ? $_POST['password'] : '';

	$reponse = $bdd->query('SELECT email_membre, mdp_membres FROM Membres WHERE email_membre = '.$login);
	
			if($login =='') {
			header('location: session.php?error=1'); //Si le champ d'adresse mail est vide on retourne l'erreur 1 à la page session.
			}
  
			elseif($password != $donnees['mdp_membres'] && $login != $donnees['email_membre']) { //Si le mot de passe entré est différent de celui présent dans 
			header('location: session.php?error=2'); // la bdd à l'adresse mail entrée, alors on retourne l'erreur 2 à la page session.
			}

			else {
				session_start();
				$_SESSION['login'] = $login;
				$_SESSION['password'] = $password;	//Sinon on démarre la session.
				$_SESSION['logged'] = true;

				header('Location: index.php');
			}
?>

Le problème arrive au niveau du elseif, je pense que les variables ne se remplissent pas et du coup lorsque je me connecte le script me redirige automatiquement vers l'erreur 2 qui est: "Le mot de passe ou l'adresse e-mail n'est pas valide". J'ai essayé avec
while ($donnees = $reponse->fetch())
    {    ... } $reponse->closeCursor();
Mais ça ne marche pas.. Merci d'avance pour votre aide!
Hello,

J'imagine que ton mot de passe est en MD5 dans ta base de données. Or, tu compares la valeurs récupérée en brute (le mot de passe en clair) avec le mot de passe MD5. C'est donc normal que l'erreur "Le mot de passe ne correspond pas" s'affiche.

Essai avec cette condition :


elseif(md5($password) != $donnees['mdp_membres'] && $login != $donnees['email_membre'])


Bye,
Yokii
Bonjour Yokii, je viens d'essayer avec la nouvelle condition et ça ne marche toujours pas! Je ne pense pas avoir passé mon mot de passe en MD5..
Modifié par ZeLL0uN (09 Jul 2014 - 12:12)
Bouuuh! Il faut le faire alors! Pas de mots de passe en clair dans la base Smiley cligne

Tu peux toujours afficher via de simples "echo", la valeurs de tes variables au fur-et-à-mesure de l’exécution de ton script.

On pourra savoir quel valeur pose problème, et pourquoi il rentre systématiquement dans la condition.
J'ai essayé d'afficher les valeurs demandées de la bdd via :

	try
	{
		$bdd = new PDO('mysql:host=localhost;dbname=Fontlist', 'root', 'root');
	}
	catch (Exception $e)
	{
	        die('Erreur : ' . $e->getMessage());
	}

	$reponse = $bdd->query('SELECT email_membre, mdp_membres FROM Membres WHERE email_membre = "*UneAdresseDeLaBddEntréeEnDur" '/*'.$login*/);
	echo 'test ohhh';
	while($donnees = $reponse->fetch())
    {        
	echo $donnees['email_membre'];
	echo $donnees['mdp_membres'];
	 }
    $reponse->closeCursor();

Et là, l'adresse email s'affiche et le mdp aussi.
Modifié par ZeLL0uN (09 Jul 2014 - 12:19)
Les valeurs de ce formulaire (une adresse e-mail et un mot de passe):

<form action="session-login2.php" method="post">
		<input type="text" name="login" placeholder="Votre e-mail"><br />
		<input type="password" name="password" placeholder="Votre mot de passe"><br />
		<input type="submit" value="Se connecter">
</form>
		<?php
			switch ($error) {
					case 1:
					echo"Merci de saisir un login";
					break;

					case 2;
					echo"Le mot de passe ou l'adresse e-mail n'est pas valide";
					break;

					case 3;
					echo"Vous avez été déconnecté";
					break;
					}
			?>

Modifié par ZeLL0uN (09 Jul 2014 - 14:05)
Non, qu'est-ce que PHP récupère?

TU penses que PHP récupère ça, mais peut-être que tu te trompes, et qu'il y a un soucis dans la récupération des valeurs du formulaire justement. Il te dis quoi PHP quand tu fais un echo de tes $_POST ?

$login =isset($_POST['login']) ? $_POST['login']: '';
	$password = isset($_POST['password']) ? $_POST['password'] : '';
	echo $login;
	echo $password;

PHP récupère bien les valeurs de mon formulaire, il m'a affiché exactement ce que j'avais entré.
Moi je pense que c'est la requête sql qui ne remplis pas les valeurs dans les conditions de mon ElseIf.
Je viens de trouver quelque chose!

<?php
	try
	{
		$bdd = new PDO('mysql:host=localhost;dbname=Fontlist', 'root', 'root');
	}
	catch (Exception $e)
	{
	        die('Erreur : ' . $e->getMessage());
	}

	$login =isset($_POST['login']) ? $_POST['login']: '';
	$password = isset($_POST['password']) ? $_POST['password'] : '';

	$reponse = $bdd->query('SELECT email_membre, mdp_membres FROM Membres WHERE email_membre = "'.$login.'" AND mdp_membres = "'.$password.'" ');
	  while ($donnees = $reponse->fetch())
    { 
		if($login =='') 
			{
				header('location: session.php?error=1'); //Si le champ d'adresse mail est vide on retourne l'erreur 1 à la page session.
			}

			elseif($password == $mdp/*$donnees['mdp_membres']*/ && $login == $email /*$donnees['email_membre']*/) 
			{ //Si le mot de passe entré est différent de celui présent dans 
				header('location: session.php?error=2'); // la bdd à l'adresse mail entrée, alors on retourne l'erreur 2 à la page session.
			}

			else 
			{
				session_start();
				$_SESSION['login'] = $login;
				$_SESSION['password'] = $password;	//Sinon on démarre la session.
				$_SESSION['logged'] = true;

				header('Location: index.php');
			}
		}
    $reponse->closeCursor();
?>


Maintenant lorsque les identifiants sont corrects, le script redirige vers la page d'accueil (génial c'est ce que je veux Smiley biggrin ), cela veut dire que la requête SQL compare bien dans les variables dans $_SESSION et celles dans la table de la bdd. Cependant, lorsque je rendre des faux identifiants ou je ne rentre pas de login, le script plante et me laisse sur la page blanche.
Ton scritp ne peut pas fonctionner ...

Comment tu peux comparer $mdp a $password, en sachant que jamais dans ta page tu ne définis $mdp ?

La condition ne sera jamais vérifié, du coup, tu bascules dans le "else" et donc, tu te connecte. Mais fonctionnellement, c'est faux Smiley ohwell
Voilà un élément de réponse dans le code que je te soumet.


<?php
	
	// Toujours en début de fichier
	session_start();		

	// Connexion à ma base de données
	try
	{
		$bdd = new PDO('mysql:host=localhost;dbname=Fontlist', 'root', 'root');
	}
	catch (Exception $e)
	{
	        die('Erreur : ' . $e->getMessage());
	}

	// Inutile de tester si les valeurs existent. Si elles sont vide, la requête ne retournera rien. 
	$login = $_POST['login'];
	$password = $_POST['password'];

	// Je prepare ma requête, ATTENTION aux injections SQL. 
	$bdd->prepare('SELECT id_membre, email_membre, mdp_membres FROM Membres WHERE email_membre = :login AND mdp_membres = $password; ');

	// Je bind mes valeurs de requête avec ce que j'ai récupérer avec mon formulaire de connexion
	$bdd->bindColumn(":login", $login); 
	$bdd->bindColumn(":password", $password); 


	// J'execute ma requête
	$bdd->execute();
	
	// Je récupère UN SEUL résultat de ma requête. On imagine donc qu'il n'est pas possible d'avoir deux utilisateurs avec le même mail.
	$user = $reponse->fetch(PDO::FETCH_ASSOC);
	$reponse->closeCursor();

	// Si dans mon curseur, j'ai un ID de membre, c'est que dans ma base, j'ai bien un utilisateur qui correspond à cet email et à ce MDP. Je lance la connexion
	if(isset($user["id_membre"]) && $user["id_membre"] != ""){
		
		// Oui. Pourquoi ne pas y rajouter, l'ID de l'utilisateur. Ca pourrais par la suite permettre la récupération de toute les infos. Pour le profil par exemple.
		$_SESSION['login'] = $login;
		
		// Stocker le password ... Pourquoi faire?
		//$_SESSION['password'] = $password;
		
		// Quel est l'interêt de cette variable? Si je suis connecté, alors ma session existe, sinon, c'est que je suis déconnecté. Pas besoin d'une variable en plus
		//$_SESSION['logged'] = true;
		
		header('Location: index.php');
	}else{
		// Je déclenche une erreur
		header('location: session.php?error=1');
	}


Dans l'idée, Si tu trouves un utilisateurs avec un email et un MDP identique a ce que tu passes via ton formulaire, tu te connecte. Sinon, tu déclenche une erreur.
J'ai une question sur ton code..

$bdd->prepare('SELECT id_membre, email_membre, mdp_membres FROM Membres WHERE email_membre = :login AND mdp_membres = [b]$password;[/b] ');

Il y a-t-il une erreur ici?

A propos de la troisième variable logged elle permet à une autre page de vérifier que l'utilisateur est bien connecté et ne tente pas d'accéder directement à index.php.
Oups oui! C'est
:password
qu'il faut mettre.

Pour ta variable logged, elle ne sert pas. Puisque tu peux savoir si la personne est connectée via le tableau $_SESSION. Si le tableau est vide, c'est que l'utilisateur n'est pas connecté, tout simplement Smiley cligne
Modifié par Yokii (09 Jul 2014 - 16:37)
Ben j'ai récupéré ce que tu as fait pourtant...

En gros, fonctionnellement tu dois avoir ce schéma:
Récupération variables POST >>> comparaison avec la base >>> Affichage de la page en fonction du résultat.

En sachant que si ton résultat est vide, c'est que la personne qui tente de se connecter n'existe pas dans la base. Et qu'elle n'est donc pas inscrite!
Donc voilà ce que j'ai essayé:

<?php
	session_start();		

	// Connexion à la base de données
	try
	{
		$bdd = new PDO('mysql:host=localhost;dbname=Fontlist', 'root', 'root');
	}
	catch (Exception $e)
	{
	        die('Erreur : ' . $e->getMessage());
	}

	$login = $_POST['login'];
	$password = $_POST['password'];

	$bdd->prepare('SELECT id_membre, email_membre, mdp_membres FROM Membres WHERE email_membre = :login AND mdp_membres = [langue]assword');

	// bind des valeurs de requête avec ce que le formulaire de connexion a récupéré
	$bdd->bindColumn(":login", $login); 
	$bdd->bindColumn(":password", $password); 


	// execute la requête
	$bdd->execute();
	
	$user = $reponse->fetch(PDO::FETCH_ASSOC);
	$reponse->closeCursor();

	if(isset($user["id_membre"]) && $user["id_membre"] != ""){
		
		$_SESSION['login'] = $login;
		
		header('location: index.php');
	}else{
		// Déclenche une erreur
		header('location: session.php?error=2');
	}
?>

Rien ne marche, j'ai affiché les POST et les variables de la bdd pour m'assurer que les valeurs passés bien dans la page.
Petite remarque: J'ai mis "id_membre" en supposant que ce champ existait bel et bien dans ta base. Il faut bien évidemment que le champ existe et soit rempli pour que cela fonctionne.

Sinon, tes variables sont bien remplies dans ta page?
Oui id_membre existe bien!
Si tu parles de ma page de bdd, oui j'ai réalisé quelques inscriptions pour pouvoir tester plusieurs cas
Pages :