Connexion.php

Fermé
salut790 Messages postés 7 Date d'inscription mardi 13 juin 2017 Statut Membre Dernière intervention 20 septembre 2017 - Modifié le 17 juin 2017 à 01:22
jordane45 Messages postés 38269 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 4 novembre 2024 - 18 juin 2017 à 17:24
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 265 Date d'inscription mardi 25 avril 2017 Statut Membre Dernière intervention 20 juillet 2017 11
17 juin 2017 à 02:00
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 Date d'inscription mardi 13 juin 2017 Statut Membre Dernière intervention 20 septembre 2017
17 juin 2017 à 02:30
Je n'ai pas bien saisi ta réponse, peux-tu la détailler s'il te plaît ?
0
Felice_ Messages postés 265 Date d'inscription mardi 25 avril 2017 Statut Membre Dernière intervention 20 juillet 2017 11 > salut790 Messages postés 7 Date d'inscription mardi 13 juin 2017 Statut Membre Dernière intervention 20 septembre 2017
Modifié le 17 juin 2017 à 09:22
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 12157 Date d'inscription vendredi 14 décembre 2012 Statut Membre Dernière intervention 9 août 2024 4 564
17 juin 2017 à 02:34
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 Date d'inscription mardi 13 juin 2017 Statut Membre Dernière intervention 20 septembre 2017
17 juin 2017 à 21:40
Y a vraiment personnes ?
0
jumulka Messages postés 12157 Date d'inscription vendredi 14 décembre 2012 Statut Membre Dernière intervention 9 août 2024 4 564
18 juin 2017 à 01:54
heu tu as testé tous ce qu'on ta dit ?
0
yg_be Messages postés 23309 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 2 novembre 2024 Ambassadeur 1 551
Modifié le 17 juin 2017 à 22:52
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 38269 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 4 novembre 2024 4 695
18 juin 2017 à 17:24
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