Connexion.php
                    
        
     
             
                    salut790
    
        
    
                    Messages postés
            
                
     
             
            7
        
            
                                    Statut
            Membre
                    
                -
                                     
jordane45 Messages postés 40050 Statut Modérateur -
        jordane45 Messages postés 40050 Statut Modérateur -
        Salut à tous,
J'ai récemment commencé l'apprentissage du php et j'ai créé un espace membres.
Les membres sont inscrits dans une bdd qui possède deux tables (employes et experts)
J'ai fais un formulaire d'inscription pour les deux et elle a fonctionné vu que j'ai trouvé les infos saisies dans la bdd.
Mais ensuite pour l'authentification j'ai fait des bouton radio pour que l'utilisateur choisisse s'il veut s'inscrire en tant qu'expert ou bien en tant qu'employé. Pour l'employé ça marche mais pour l'expert ça me dit "mauvais pseudo ou mot de passe"
Je ne comprends pas du tout où est le problème vu que le code est quasiment le même selon qu'on choisisse employé ou bien expert, il n'y a que le nom de la table qui change.
Je ne sais vraiment plus quoi faire et j'aurais grandement besoin de votre aide.
Merci d'avance.
Voici ma page connexion.php
                
            
                
    
    
    
        J'ai récemment commencé l'apprentissage du php et j'ai créé un espace membres.
Les membres sont inscrits dans une bdd qui possède deux tables (employes et experts)
J'ai fais un formulaire d'inscription pour les deux et elle a fonctionné vu que j'ai trouvé les infos saisies dans la bdd.
Mais ensuite pour l'authentification j'ai fait des bouton radio pour que l'utilisateur choisisse s'il veut s'inscrire en tant qu'expert ou bien en tant qu'employé. Pour l'employé ça marche mais pour l'expert ça me dit "mauvais pseudo ou mot de passe"
Je ne comprends pas du tout où est le problème vu que le code est quasiment le même selon qu'on choisisse employé ou bien expert, il n'y a que le nom de la table qui change.
Je ne sais vraiment plus quoi faire et j'aurais grandement besoin de votre aide.
Merci d'avance.
Voici ma page connexion.php
<?php
session_start();
	$bdd = new PDO('mysql:host=127.0.0.1; dbname=bddsite', 'root', '');
	
	
	
	
if(isset($_POST['formconnexion']))
{
	if(isset($_POST['employe']))
	{
		echo "ok";
			$pseudoconnect = htmlspecialchars($_POST['pseudoconnect']);
			$mdpconnect = htmlspecialchars($_POST['mdpconnect']);
			if(!empty($pseudoconnect) AND !empty($mdpconnect))
			{
				$requser = $bdd->prepare("SELECT * FROM employes WHERE login = ? AND pass_md5 = ?");
				$requser->execute(array($pseudoconnect, $mdpconnect));
				$userexiste = $requser->rowCount();
				if($userexiste == 1)
				{
					$userinfo = $requser->fetch();
					$_SESSION['id'] = $userinfo['id'];
					$_SESSION['pseudo'] = $userinfo['pseudo'];
					header("Location: profil.php?id=". $_SESSION['id']);
					
					
				}
				else
				{
					echo "Mauvais pseudo ou mot de passe";
				}
			}
			else
			{
				$erreur = "Tous les champs doivent être remplies";
			}
	}
	
	if(isset($_POST['expert']))
	{
		
		echo "ok";
			$pseudoconnect = htmlspecialchars($_POST['pseudoconnect']);
			$mdpconnect = htmlspecialchars($_POST['mdpconnect']);
			if(!empty($pseudoconnect) AND !empty($mdpconnect))
			{
				$requser = $bdd->prepare("SELECT * FROM experts WHERE login = ? AND pass_md5 = ?");
				$requser->execute(array($pseudoconnect, $mdpconnect));
				$userexiste = $requser->rowCount();
				if($userexiste == 1)
				{
					$userinfo = $requser->fetch();
					$_SESSION['id'] = $userinfo['id'];
					$_SESSION['pseudo'] = $userinfo['pseudo'];
					header("Location: profilExp.php?id=". $_SESSION['id']);
					
					
				}
				else
				{
					echo "Mauvais pseudo ou mot de passe";
				}
			}
			else
			{
				$erreur = "Tous les champs doivent être remplies";
			}
	}
}
?>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title>Connexion</title>
	</head>
	<body>
		<div align="center">
			<h2>Connexion</h2>
			</br></br></br>
		
			<form method="POST" action="">
					<input type="text" name="pseudoconnect" placeholder="pseudo"/>
					<input type="password" name="mdpconnect" placeholder="mot de passe"/>
					<option>
						Se connecter en tant qu'employé <input type="radio" name="employe" id="radio"/></br>
						</option>
						
						<option>
						Se connecter en tant qu'expert <input type="radio" name="expert" id="radio"/>
						</option>
					
					</br>
					<input type="submit" name="formconnexion" value="Se connecter"/>
					<a href="inscription.php" rel="nofollow noopener noreferrer" target="_blank"> S'inscrire </a>
					
			</form>
			
			<?php
				if(isset($erreur))
				{
					echo '<font color ="red">' . $erreur . '</font>';
				}
			?>
		
	</body>
</html>
            
            5 réponses
                        
                    Bonjour salut790,
S'il n'y a que le nom de ta table qui change, ton code ne devrai avoir la condition qu'à ce niveau :
    
                S'il n'y a que le nom de ta table qui change, ton code ne devrai avoir la condition qu'à ce niveau :
$table = '';
if(isset($_POST['employe'])) {
    $table = 'employes';
} else if(isset($_POST['expert'])) {
    $table = 'experts';
} else {
    exit;
}
                
                
                        
                    Bonjour,
je pense que c'est plus simple que ça, dans ta partie expert, tu appelle la table experts dans la base de données bddsite. vérifie bien que ce sont les même nom de table, et que les colonnes correspondent bien à "login" et "pass_md5". les espaces comptes donc vérifie bien que tu n'a pas mis d'espace avant ou après dans ta base de données.
ton code a fonctionner pour moi
par contre les 2 radio peuvent être sélectionné, je ne pense pas que ce soit voulue, je te conseil de leur mettre le même name, des valeurs différentes et comparer les valeurs.
    
                je pense que c'est plus simple que ça, dans ta partie expert, tu appelle la table experts dans la base de données bddsite. vérifie bien que ce sont les même nom de table, et que les colonnes correspondent bien à "login" et "pass_md5". les espaces comptes donc vérifie bien que tu n'a pas mis d'espace avant ou après dans ta base de données.
ton code a fonctionner pour moi
par contre les 2 radio peuvent être sélectionné, je ne pense pas que ce soit voulue, je te conseil de leur mettre le même name, des valeurs différentes et comparer les valeurs.
                        
                    je pense que tu n'utilises pas correctement les boutons radios dans ton formulaire html.
pour en être certain, ajoute
tu y verrais aussi plus clair si tu avais des messages plus précis:
je te suggère d'étudier l'utilisation des boutons radio en html, par exemple ici: https://www.xul.fr/html5/bouton-radio.php
    
                pour en être certain, ajoute
print_r($_POST);et analyse le résultat.
tu y verrais aussi plus clair si tu avais des messages plus précis:
echo "Mauvais pseudo (employé ou expert?) ou mot de passe";
je te suggère d'étudier l'utilisation des boutons radio en html, par exemple ici: https://www.xul.fr/html5/bouton-radio.php
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
                        
                    Bonjour,
Plusieurs choses :
Pourquoi avoir fait deux tables ???
Une seule suffit. et tu ajoutes un champ qui permet d'identifier le profil...
par exemple, une table "membres" ( id, nom, prenom, mail, pseudo, password, profil ... etc...)
Donc.. en fonction du User/password utilisé pour se connecter.. l'utilisateur sera reconnu en tant qu'expert ou employé (si son compte existe dans la bdd avec l'un des profils...)
 
Déjà on commence par placer le code de connexion à la bdd dans un fichier
à part qu'on aura qu'à inclure dans nos différentes pages.
AU passage... on y active la gestion des erreurs PDO (voir ici : https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs )
 
 
Ensuite...
- en PDO.. on n'utilise pas rowCount !
Comme le dit la documentation... à la place on fera plutôt un count sur le fetchAll
- htmlspecialchars ne s'utilise que pour AFFICHER ... pas pour faire des requêtes ou l'insertion de données en bdd !
 
 
Donc voici à quoi ressemble le reste de ton code :
 
Par contre .. en regardant ton code... il semble que tu n'as pas crypté le password.
A minima tu pourrais faire du SHA1 ...
Mais désormais il est conseillé d'utiliser la fonction password_verify : https://www.php.net/manual/fr/function.password-verify.php
Comme ici par exemple :
https://forums.commentcamarche.net/forum/affich-34340900-login-password-php#7
 
 
                
                
    
                Plusieurs choses :
Les membres sont inscrits dans une bdd qui possède deux tables (employes et experts)
Pourquoi avoir fait deux tables ???
Une seule suffit. et tu ajoutes un champ qui permet d'identifier le profil...
par exemple, une table "membres" ( id, nom, prenom, mail, pseudo, password, profil ... etc...)
Donc.. en fonction du User/password utilisé pour se connecter.. l'utilisateur sera reconnu en tant qu'expert ou employé (si son compte existe dans la bdd avec l'un des profils...)
Déjà on commence par placer le code de connexion à la bdd dans un fichier
à part qu'on aura qu'à inclure dans nos différentes pages.
AU passage... on y active la gestion des erreurs PDO (voir ici : https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs )
  <?php
  //Fichier : cnxbdd.php
  // connexion à la bdd
  try{
    $bdd =new PDO('mysql:host=localhost;dbname=bddsite; 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());
  }
  ?>
 
 
Ensuite...
- en PDO.. on n'utilise pas rowCount !
Comme le dit la documentation... à la place on fera plutôt un count sur le fetchAll
- htmlspecialchars ne s'utilise que pour AFFICHER ... pas pour faire des requêtes ou l'insertion de données en bdd !
Donc voici à quoi ressemble le reste de ton code :
 <?php
 
//affichage des erreurs PHP
error_reporting(E_ALL);
ini_set('display-errors','on');
//Démarrage des sessions:
session_start();
//connexion à la bdd :
require_once 'cnxbdd.php';
// réupération PROPRE des variables AVANT de les utiliser  	
$pseudoconnect = !empty($_POST['pseudoconnect']) ? $_POST['pseudoconnect'] : NULL;
$mdpconnect = !empty($_POST['mdpconnect']) ? $_POST['mdpconnect'] : NULL; 
	
//traitement du submit :  
if(isset($_POST['formconnexion'])) {
  if($pseudoconnect && $mdpconnect){
   $sql = "SELECT * FROM employes WHERE login = ? AND pass_md5 = ?";
   $datas = array($pseudoconnect, $mdpconnect);
   try{
    $requser = $bdd->prepare($sql);
    $requser->execute($datas);
    $resultat = $requser->fetchAll(); //on stocke les données dans un array
   }catch(PDOException $e) {
     $erreur = 'Erreur : ' . $e->getMessage();
   }
 
  $nbresult = !empty($resultat) ? count($resultat) : 0 ;
  if($nbresult == 1){
    $userinfo = $resultat[0];
    $_SESSION['id'] = $userinfo['id'];
		$_SESSION['pseudo'] = $userinfo['pseudo'];
    $_SESSION['profil'] = $userinfo['profil'];
    
    $urlTogo = $userinfo['profil'] == "employe" ? "profil" : ($userinfo['profil'] == "expert" ? "profilExp" : NULL);
    if($urlTogo){
      header("Location: profil.php");
      exit(); // toujours faire un exit après une redirection
    }else{
      $erreur = "Profil de l'utilisateur inconnu !";
    }
  }else{
   $erreur = "Mauvais pseudo ou mot de passe";
  }
 }else{
   $erreur = "Tous les champs doivent être remplies";
 }
}
 
?>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title>Connexion</title>
	</head>
	<body>
		<div align="center">
			<h2>Connexion</h2>
			</br></br></br>
		
			<form method="POST" action="">
					<input type="text" name="pseudoconnect" placeholder="pseudo"/>
					<input type="password" name="mdpconnect" placeholder="mot de passe"/>
				
					</br>
					<input type="submit" name="formconnexion" value="Se connecter"/>
					<a href="inscription.php" rel="nofollow noopener noreferrer" target="_blank"> S'inscrire </a>
					
			</form>
			
			<?php
				if(!empty($erreur)){
					echo '<font color ="red">' . $erreur . '</font>';
				}
			?>
		
	</body>
</html>
Par contre .. en regardant ton code... il semble que tu n'as pas crypté le password.
A minima tu pourrais faire du SHA1 ...
Mais désormais il est conseillé d'utiliser la fonction password_verify : https://www.php.net/manual/fr/function.password-verify.php
Comme ici par exemple :
https://forums.commentcamarche.net/forum/affich-34340900-login-password-php#7
 
    
    
    
    
T'es lignes ici peuvent être remplacer par :
Donc tu peux tout factoriser.
De plus, au passage, il ne faut pas utiliser le caractère « * » à moins que tu utilises tous les champs…