Login - Password PHP [Résolu]

M_Tufux 70 Messages postés dimanche 11 octobre 2015Date d'inscription 6 juin 2017 Dernière intervention - 6 févr. 2017 à 16:45 - Dernière réponse : jordane45 19205 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 11 décembre 2017 Dernière intervention
- 7 févr. 2017 à 18:33
Hello,

Je n'arrive pas à faire correctement cette fonction de login. J'ai lié un fichier index.php dans lequel j'ai mis la session, vous le remarquerez avec le return true dans register.

Première question, pourquoi Est-ce que le password verify ne fonctionne pas?
Ensuite, je ne sais plus comment gérer l'erreur dans la fnc Register. L'erreur, c'est à dire si la BD ne répond pas ou qqch du genre.

<?php


	function Login($user, $pass){
		$pass = password_hash($pass, PASSWORD_DEFAULT);
		$userdb = 'root';
		$passdb = '';
		$cnn = new PDO('mysql:host=localhost;dbname=siteTest', $userdb, $passdb);
		$stmt = $cnn->prepare('SELECT UserName, Password FROM login WHERE UserName   = :user');
		$stmt->bindParam(':user', $user);
		$stmt -> execute();
		$row = $stmt->fetch(PDO::FETCH_OBJ);
		print $row->Password;

		if(password_verify($pass, $row->Password)){
			echo 'hellow';
		}
	}
	
	function Register($user, $pass){
		$pass = password_hash($pass, PASSWORD_DEFAULT);
		$userdb = 'root';
		$passdb = '';
		$cnn = new PDO('mysql:host=localhost;dbname=siteTest', $userdb, $passdb);
		$stmt = $cnn->prepare('INSERT INTO login (UserName, Password) VALUES (:user, :pass)');
		$stmt->bindParam(':user', $user);
		$stmt->bindParam(':pass', $pass);
		$stmt -> execute();
		return true;
	}



?>


J'accepterais avec plaisir de l'aide :)

Merci beaucoup!!
Afficher la suite 
70Messages postés dimanche 11 octobre 2015Date d'inscription 6 juin 2017 Dernière intervention

6 réponses

Répondre au sujet
jordane45 19205 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 11 décembre 2017 Dernière intervention - 6 févr. 2017 à 16:59
0
Utile
4
Bonjour,

1 - Place le code de connexion à ta BDD à part ... pour ne pas avoir à la réécrire à chaque fois ...

2 - Active la gestion des erreurs PDO
voir ici : http://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs


3 - Voici un petit exemple :
<?php
// fichier de connexion à la bdd : cnxBdd.php
function get_cnx(){
 $bdd = NULL;
 try{
  $bdd = new PDO('mysql:host=localhost;dbname=siteTest', $userdb, $passdb);
  $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
 } catch(PDOException $e) {
    die('Erreur : ' . $e->getMessage());
 }
 return $bdd;
}




jordane45 19205 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 11 décembre 2017 Dernière intervention - 6 févr. 2017 à 17:01
Et pour l'utiliser, il te suffit de faire :
$cnn = get_cnx();
M_Tufux 70 Messages postés dimanche 11 octobre 2015Date d'inscription 6 juin 2017 Dernière intervention > jordane45 19205 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 11 décembre 2017 Dernière intervention - 7 févr. 2017 à 09:39
Yeep merci pour ta réponse, mais ça ne répond pas à ma première question qui était "pourquoi Est-ce que le password_verify ne fonctionne pas"
jordane45 19205 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 11 décembre 2017 Dernière intervention > M_Tufux 70 Messages postés dimanche 11 octobre 2015Date d'inscription 6 juin 2017 Dernière intervention - 7 févr. 2017 à 10:17
http://php.net/manual/fr/function.password-verify.php
- As tu vérifié ce que contenait ta variable $row->Password ?
- Ton champ Password dans ta BDD est dimensionné à combien de caractères ?
- Tu as fais un echo du hash dans ta fonction register pour voir si la valeur en BDD est correctement stockée ?
- Tu as quelle version de php ?
M_Tufux 70 Messages postés dimanche 11 octobre 2015Date d'inscription 6 juin 2017 Dernière intervention - 7 févr. 2017 à 16:44
Hello,

C'est bon j'ai trouvé. J'avais hashé le mot de passe avant de le mettre dans le verify.

Et il y a LARGEMENT moyen d'optimiser tout ça. Le but de ce test était justement de me remettre dans le bain. L'optimisation peut-être que je m'en occuperai plus tard.

Voici mon code en vrac:
index.php

<?php
	session_start();
	include('head.php');
	$error = '';
	$userName = '';
	$password = '';
	$bLogin = false;
	$bRegister = false;
	
	//VERIFIE SI FORMULAIRE ENVOYÉ OU PAS
	if(isset($_POST['deco'])){
		session_destroy();
	}
	if(isset($_POST['userName']) && isset($_POST['pass'])){
		if(!empty($_POST['userName']) && !empty($_POST['pass'])){
			$userName = $_POST['userName'];
			$password = $_POST['pass'];
			if(isset($_POST['valider'])){
				$bLogin = Login ($userName, $password);
				if($bLogin == true){
					$_SESSION['user'] = $userName;
				}
				else{
					echo "LOGIN OU MOT DE PASSE INVALIDE";
				}
			}
			if(isset($_POST['register'])){
				$bRegister = Register($userName, $password);
				if($bRegister == true){
					$_SESSION['user'] = $userName;
				}
			}
			
		}
		else{
			$error = 'Veuillez remplir tous le champs!';
		}
	}

?>

<!DOCTYPE HTML>
<html>
	<body>
		<!-- FORMULAIRE AVEC LOGIN MDP -->
		<div id="divIndex1">
			<form action="<?=$_SERVER['PHP_SELF']?>" method="POST">
				<label class="login">Nom d'utilisateur</label><input class="inputLogin" type="text" name="userName" /><br/>
				<label class="login">Mot de passe</label><input class="inputLogin" type="password" name="pass"><br/>
				<label id="login-submit"><?php echo $error; ?></label><input class="inputLogin" type="submit" name="valider" value="valider"/>
				<input class="inputLogin" type="submit" name="register" value="s'enregistrer"/><br/>
				<?php if(isset($_SESSION['user'])){echo $_SESSION['user'];} ?>
			</form>
			<form action="<?=$_SERVER['PHP_SELF']?>" method="POST">
				<input class="inputLogin" type="submit" name="deco" value="se déconnecter"/>
			</form>
		</div>
	</body>
	
	<?php include('footer.php'); ?>
</html>



<?php


function Login($user, $pass){
$userdb = 'root';
$passdb = '';
$cnn = new PDO('mysql:host=localhost;dbname=siteTest', $userdb, $passdb);
$stmt = $cnn->prepare('SELECT UserName, Password FROM login WHERE UserName = :user');
$stmt->bindParam(':user', $user);
$stmt -> execute();
$row = $stmt->fetch(PDO::FETCH_OBJ);
print $row->Password;



if (password_verify($pass, $row->Password)) {
return true;
} else {
return false;
}
}

function Register($user, $pass){
$pass = password_hash($pass, PASSWORD_DEFAULT);
$userdb = 'root';
$passdb = '';
$cnn = new PDO('mysql:host=localhost;dbname=siteTest', $userdb, $passdb);
$stmt = $cnn->prepare('INSERT INTO login (UserName, Password) VALUES (:user, :pass)');
$stmt->bindParam(':user', $user);
$stmt->bindParam(':pass', $pass);
$stmt -> execute();
return true;
}



?>

MySQL.php






Encore merci pour ton aide Jordane45
Bonne soirée!
Commenter la réponse de jordane45
jordane45 19205 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 11 décembre 2017 Dernière intervention - Modifié par jordane45 le 7/02/2017 à 18:38
0
Utile
Histoire d'améliorer un peu :
Index.php
<?php
 session_start();
 include('head.php');
 $error = '';
 $bLogin = false;
 $bRegister = false;
 
 //VERIFIE SI FORMULAIRE ENVOYÉ OU PAS
 if(isset($_POST['deco'])){
  session_destroy();
 }
  
  
  // Récupération PROPRE des variables AVANT de les utiliser :
  $userName = !empty($_POST['userName']) ? $_POST['userName'] : NULL;
  $password = !empty($_POST['pass']) ? $_POST['pass'] : NULL;
  
  $user = isset($_SESSION['user']) ? $_SESSION['user'] : ""; 
  
 if($userName && $pass)){

   if(isset($_POST['valider'])){
    $bLogin = Login ($userName, $password);
    if($bLogin == true){
     $_SESSION['user'] = $userName;
    } else {
     echo "LOGIN OU MOT DE PASSE INVALIDE";
    }
   }
      
   if(isset($_POST['register'])){
    $bRegister = Register($userName, $password);
    if($bRegister == true){
     $_SESSION['user'] = $userName;
    }
   }
   
  }
  else{
   $error = 'Veuillez remplir tous le champs!';
  }


?>
<!DOCTYPE HTML>
<html>
 <head>
  <meta charset="utf8">
  <title></title>
 </head>
 <body>
  <!-- FORMULAIRE AVEC LOGIN MDP -->
  <div id="divIndex1">
   <form action="" method="POST">
    <label class="login">Nom d'utilisateur</label><input class="inputLogin" type="text" name="userName" /><br/>
    <label class="login">Mot de passe</label><input class="inputLogin" type="password" name="pass"><br/>
    <label id="login-submit"><?php echo $error; ?></label><input class="inputLogin" type="submit" name="valider" value="valider"/>
    <input class="inputLogin" type="submit" name="register" value="s'enregistrer"/><br/>
    <?php echo $user;} ?>
   </form>
      <?php
      if(!empty($user)){
      ?>
      <form action="" method="POST">
    <input class="inputLogin" type="submit" name="deco" value="se déconnecter"/>
   </form>
      <?php
      }
      ?>
  </div>
 </body>
 
 <?php include('footer.php'); ?>
</html>



Fichier de connexion à la bdd
<?php
// fichier de connexion à la bdd : cnxBdd.php
function get_cnx(){
 $bdd = NULL;
 $userdb = 'root';
 $passdb = ''; 
 try{
  $bdd = new PDO('mysql:host=localhost;dbname=siteTest', $userdb, $passdb);
  $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::ASSOC);
 } catch(PDOException $e) {
    die('Erreur : ' . $e->getMessage());
 }
 return $bdd;
}



Tes autres codes :
<?php

//Import fichier de connexion à la bdd
require_once "cnxBdd.php";


/**
* Foncion LOGIN
*/
function Login($user, $pass){
  $cnn = get_cnx();
  try{
    $stmt = $cnn->prepare('SELECT UserName, Password FROM login WHERE UserName = :user');
    $stmt->bindParam(':user', $user);
    $stmt->execute();
    $row = $stmt->fetch(PDO::FETCH_OBJ);
  }catch(Exception $e){
    echo "Error !" .$e->getMessage();
  }
   //print $row->Password;
  return  password_verify($pass, $row->Password) ? true : false ;
}

/**
* Foncion REGISTER
*/
function Register($user, $pass){
  $pass = password_hash($pass, PASSWORD_DEFAULT);

  $cnn = $cnn = get_cnx();
  try{
    $stmt = $cnn->prepare('INSERT INTO login (UserName, Password) VALUES (:user, :pass)');
    $stmt->bindParam(':user', $user);
    $stmt->bindParam(':pass', $pass);
    $result = $stmt->execute();
  }catch(Exception $e){
    echo "Error !" .$e->getMessage();
    $result = false;  
  }
  return $result;
} 
Commenter la réponse de jordane45