Connexion.php

salut790 Messages postés 7 Statut Membre -  
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
<?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

Felice_ Messages postés 271 Statut Membre 11
 
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 :

$table = '';

if(isset($_POST['employe'])) {
    $table = 'employes';
} else if(isset($_POST['expert'])) {
    $table = 'experts';
} else {
    exit;
}
0
salut790 Messages postés 7 Statut Membre
 
Je n'ai pas bien saisi ta réponse, peux-tu la détailler s'il te plaît ?
0
Felice_ Messages postés 271 Statut Membre 11 > salut790 Messages postés 7 Statut Membre
 
SELECT * FROM employes WHERE login = ? AND pass_md5 = ?

SELECT * FROM experts WHERE login = ? AND pass_md5 = ?


T'es lignes ici peuvent être remplacer par :
SELECT * FROM $table WHERE login = ? AND pass_md5 = ?


Donc tu peux tout factoriser.

De plus, au passage, il ne faut pas utiliser le caractère « * » à moins que tu utilises tous les champs…
0
jumulka Messages postés 12872 Statut Membre 4 578
 
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.
0
salut790 Messages postés 7 Statut Membre
 
Y a vraiment personnes ?
0
jumulka Messages postés 12872 Statut Membre 4 578
 
heu tu as testé tous ce qu'on ta dit ?
0
yg_be Messages postés 24281 Statut Contributeur Ambassadeur 1 584
 
je pense que tu n'utilises pas correctement les boutons radios dans ton formulaire html.
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jordane45 Messages postés 40050 Statut Modérateur 4 758
 
Bonjour,


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


0