Creer un formulaire de login

Fermé
didier - 17 mars 2023 à 13:18
jordane45 Messages postés 38446 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 28 février 2025 - 19 mars 2023 à 10:47

Bonjour,

svp j'ai essayé de créer un formulaire de connexion en php mais j'ai un problème avec ma condition et cela ne me renvooi aucune erreur le code se comporte comme si la condition était toujours vrai j'ai besoin d'aide

voici le code source.

session_start();
	$bdd = new PDO("mysql:host=localhost;dbname=trainees_db", "root", "", [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
	if (isset($_POST['signin'])) {
		if (!empty($_POST["login"]) AND !empty($_POST["password"])) {
			$login = htmlspecialchars($_POST['login']);
			$password = $_POST['password'];
			$result = $recupUser = $bdd->query("SELECT * FROM stagiaire WHERE Login ='$login'AND Password ='$password'");
			$result->fetch();
			if ($result) {
				$_SESSION['user_name'] = $login;
				$_SESSION['password'] = $password;
				$_SESSION['id'] = $recupUser->fetch()['id'];
				header("Location: index.php");
			}
			else{
				echo "Your password or login is incorrect";
			}
		}
		else{
			echo "Please fill all the textfields";
		}
	}
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>login</title>
	<link rel="stylesheet" href="css/bootstrap.min.css">
</head>
<body class="">
	<div class="container-fluid d-flex" style="height: 100vh; background: #33A944;">
	<div class="container-fluid m-auto">
	<form action="" class="w-25 justify-content-center p-5 m-auto bg-light border border-dark" method="post">
	  <h1 class="h1 text-dark m-3">Login</h1>
	  <div class="form-group m-3">
	    <label for="email" class="text-dark">Login:</label>
	    <input type="text" class="form-control" placeholder="Enter login" id="login" name="login">
	  </div>
	  <div class="form-group m-3">
	    <label for="pwd" class="text-dark">Password:</label>
	    <input type="password" class="form-control" placeholder="Enter password" id="pwd" name="password">
	  </div>
	  <div class="form-group form-check m-3">
	    <label class="form-check-label text-dark">
	      <input class="form-check-input" type="checkbox"> Remember me
	    </label>
	  </div>
	  <button type="submit" class="btn btn-primary m-3" name="signin">Submit</button>
	  <div class="form-group m-3">
	  	<a href="Signup.php" class="btn-link text-dark">Don't have an account? Sign Up</a>
	  </div>
	</form>
	</div>
	</div>
</body>
</html>

Merci d'avance
Windows / Chrome 111.0.0.0
 

2 réponses

lina-24 Messages postés 63 Date d'inscription vendredi 6 novembre 2020 Statut Membre Dernière intervention 25 mars 2023 4
19 mars 2023 à 05:23

D'après le code que vous avez fourni, il semble que le problème se situe au niveau de la ligne suivante :

$result->fetch();
if ($result) {

Vous appelez la fetch()méthode de la $resultvariable, mais vous ne stockez son résultat nulle part. De plus, la if ($result)condition sera toujours vraie, même si la requête ne renvoie aucune ligne, car $resultsera toujours un objet de type PDOStatement.

Au lieu de cela, vous devriez vérifier si la $result->fetch()méthode renvoie une ligne de la base de données, comme ceci :

$row = $result->fetch();
if ($row) {
    // stocker les variables de session et rediriger vers index.php
} else {
    echo "Votre mot de passe ou login est incorrect";
}
1
jordane45 Messages postés 38446 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 28 février 2025 4 737
17 mars 2023 à 14:01

Bonjour,

Commence par appliquer ceci : 

https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs

et pense bien à mettre en commentaire la redirection dans ton code pour pouvoir voir les éventuelles erreurs.


0
jordane45 Messages postés 38446 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 28 février 2025 4 737
Modifié le 19 mars 2023 à 10:48

A noter également qu'on ne stocke jamais un mot de passe en clair dans la bdd.

Il faut le hasher ... ( "crypter" ) 

Pour ça, php fourni la fonction password_hash  (que tu trouveras sans mal sur internet)

Et donc, une fois le mot de passe protégé en bdd, ton code pourra ressembler à ça :

 <?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=trainees_db; charset=utf8', 'root', '');
	// 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
$login = !empty($_POST['login']) ? trim($_POST['login']) : NULL;
$password = !empty($_POST['password']) ? trim($_POST['password']) : NULL;

//traitement ..
if($login){
	//préparation de la requête et des variables
	 $sql = "SELECT * FROM infos_persos WHERE Login = :login";
	 $datas = array(':login'=>$login);
	//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 'login inconnu  !';
	}else{
		// Comparaison du pass envoyé via le formulaire avec la base
		$isPasswordCorrect = password_verify($password, $resultat['Password']);
	  if ($isPasswordCorrect){
		  $_SESSION['user_name'] = $login;
		  $_SESSION['password'] = $password;
		  $_SESSION['id'] = $resultat['id'];
		  header("Location: index.php");
          exit;
	  }else{
	    echo 'Mauvais identifiant ou mot de passe !';
	  }
	}
}else{
  echo "Merci de renseigner un login !";
}
0