[RESOLU] session avec Bdd

Eléphant du PHP | 116 Messages

12 mai 2018, 17:34

Bonjour,

j'ai créer 3 pages : index.php, session-login.php, session-verif.php.
La 1ère page permet de m'identifier via un formulaire.
la 2ème traite la validité du login et password.
La 3ème sera le petit fichier à inclure dans toutes les autres pages de mon site.

Je voudrais maintenant vérifier mes password selon les 2 identifiants : Administrateur et Agent.
ex : login = Agent et password = toto.

Je prend la methode : password_hash.

Code : Tout sélectionner

$hash = password_hash('toto', PASSWORD_DEFAULT); echo $hash;
ensuite je colle le résultat dans mon champ créer au préalable dans ma Bdd.

Mon soucis maintenant comment et ou je dois creer mon code pour verifier le mot de passe correspondant a "toto" ?
Page index.php :

Code : Tout sélectionner

<?php $error = isset($_GET['error']) ? $_GET['error'] : ''; $psw = isset($_GET['psw']) ? $_GET['psw'] : ''; ?> <!DOCTYPE html> <html lang="fr"> <head> ..... </head> <body> <div class="bg-img"> <form action="/essai/session/session-login.php" method="post"> <div class="cont"> <h1>Se connecter</h1> <label for="login"><b>Login</b></label> <SELECT name="login" size="1"> <OPTION>Administrateur <OPTION selected=>Agent </SELECT> <label for="psw"><b>Mot de passe</b></label> <input type="password" placeholder="Votre mot de passe" name="psw"> <button type="submit" class="btn">Se connecter</button> <?php /* Ci-dessous,mon SWITCH case qui porte sur la $error ci-dessus, selon le code error (1 ou 2) */ switch ($error){ case 1: echo "merci de saisir un login"; break; case 2: echo "Le mot de passe <b>$psw</b> n'est pas valide..."; break; case 3: echo "Vous avez été deconnecté"; break; } ?> </div> </form> </div>
page session-login.php :

Code : Tout sélectionner

<?php /* Si les variables sont définies */ $login = isset($_POST['login']) ? $_POST['login'] : ''; $psw = isset($_POST['psw']) ? $_POST['psw'] : ''; /* Test de validité d'informations de connection */ if($login == '') { /*si la var est vide*/ header('Location: /essai/index.php?error=1'); }elseif ($psw != "toto") { /* si psw different de toto,*/ header('Location: /essai/index.php?error=2&psw='.$psw); }else { session_start(); /*si login pas vide, si psw = toto, on demarre la session*/ $_SESSION['login'] = $login; $_SESSION['psw'] = $psw; $_SESSION['logged'] = true; header('Location: /essai/session/session-bienvenu.php'); } ?>
Dans cette page j'avais mis "toto" comme password, pour tester mon code. Il va falloir biensure que je supprime cette ligne.
Page session-verif.php :

Code : Tout sélectionner

<?php session_start(); /* Ci-dessous, si la Super global $_SESSION['logged'] n'est pas défini(!isset) * OU * n'est pas égale à VRAIE(true) * alors on redirige l'tilisateur sur la page d'acceuil avec un param code error=3 */ if(!isset($_SESSION['logged']) || !$_SESSION['logged']) { header('Location: /essai/index.php?error=3'); } /* Ci-dessous, le code permet de récupérer le login de l'utilisateur, * que l'on pourra utilisé pour les differentes pages par la suite */ $login = isset($_SESSION['login']) ? $_SESSION['login'] : ''; [quote]je pense que là je pourrais mettre mon test password pour la Bdd[/quote] ?>

Mammouth du PHP | 889 Messages

12 mai 2018, 17:44

c'est dans page session-login.php qu'il faut faire le travail.
si le $psw et $login sont différents de '', alors il faut faire une requête du type
select * from users where login = ... and psw = '$hash'
avec $hash = password_hash($psw, PASSWORD_DEFAULT);
s'il y a un enregistrement, alors le password est bon, on créé la session.

dans la verif sur les autres pages, il n'y a que
if(!isset($_SESSION['logged']) || !$_SESSION['logged']) {
à faire.

Eléphant du PHP | 116 Messages

13 mai 2018, 19:20

Merci or,
J'ai donc fait cela :

Code : Tout sélectionner

<?php /*Si les variables sont définies */ $login = isset($_POST['login']) ? $_POST['login'] : ''; $psw = isset($_POST['psw']) ? $_POST['psw'] : ''; $hash = password_hash($psw, PASSWORD_DEFAULT); // On se connecte à la Bdd try { $bdd = new PDO('mysql:host=localhost;dbname=lpa;charset=utf8', 'root', 'root'); } catch (Exception $e) { die('Erreur de connection à la Bdd : ' . $e->getMessage()); } // On récupère tout le contenu de la table $reponse = $bdd->query('SELECT * FROM users WHERE login = "'.$login.'" and psw = "'.$hash.'"'); while ($donnees = $reponse->fetch()){ $donnees['login']; $donnees['psw']; } /* Test de validité d'informations de connection */ if ($donnees['login'] == ''){ header('Location: /essai/index.php?error=1'); } elseif ($donnees['psw'] !== $psw) { header('Location: /essai/index.php?error=2&psw='.$psw); } else { session_start(); /* sinon on demarre la session*/ $_SESSION['login'] = $login; $_SESSION['psw'] = $psw; $_SESSION['logged'] = true; header('Location: /essai/session/session-bienvenu.php'); } ?>
Mais cela ne fonctionne pas.
Il me rejette tjrs sur mon code erreur=1, c à d, "Veuillez entrer un login" ??

Mammouth du PHP | 889 Messages

13 mai 2018, 19:38

que sont sensées faire ces 2 lignes ?
$donnees['login'];
$donnees['psw'];

Eléphant du PHP | 116 Messages

13 mai 2018, 21:07

or 1, c'est vraie que là cela ne sert à rien.
En fait mon idée c'est de passé en revue les champs de la table et de les comparé avec mes entrées. Ensuite dès que un champs correspond, cela permet de lancer ma session.
Mais je bute sur cette partie.

Eléphant du PHP | 116 Messages

14 mai 2018, 10:42

J'ai modifié en faisant cela :

Code : Tout sélectionner

<?php /*Si les variables sont définies */ $login = isset($_POST['login']) ? $_POST['login'] : ''; $psw = isset($_POST['psw']) ? $_POST['psw'] : ''; $hash = password_hash($psw, PASSWORD_DEFAULT); // On se connecte à la Bdd try { $bdd = new PDO('mysql:host=localhost;dbname=lpa;charset=utf8', 'root', 'root'); } catch (Exception $e) { die('Erreur de connection à la Bdd : ' . $e->getMessage()); } // On récupère tout le contenu de la table $reponse = $bdd->query('SELECT * FROM users WHERE login = "'.$login.'" and psw = "'.$hash.'"'); while ($row = $reponse -> fetch()){ $log = $row['login']; $pass = $row['psw']; } /*Test de validité d'informations de connection */ if ($log == ''){ header('Location: /essai/index.php?error=1'); } elseif ($pass !== $psw) { header('Location: /essai/index.php?error=2&psw='.$psw); } else { session_start(); /* sinon on demarre la session*/ $_SESSION['login'] = $login; $_SESSION['psw'] = $psw; $_SESSION['logged'] = true; header('Location: /essai/session/session-bienvenu.php'); } ?>
M'indique toujours :"veuillez taper votre login ??

Eléphant du PHP | 116 Messages

15 mai 2018, 13:13

Sinon comment puis je faire un var_dump dans ma page session-login pour voir l'évolution de mon code et ainsi voir les erreurs. car sur cette page quand je fais le var_dump rien ne s'affiche .

Mammouth du PHP | 889 Messages

15 mai 2018, 13:33

remplace tes header() par des echo, le temps de débuguer.

Eléphant du PHP | 116 Messages

15 mai 2018, 23:16

merci or 1,
Mais je bloque complet pour la verification du password.
J'ai enregistré dans ma Bdd au préalable, mon password hashé avec :password_hash.
Ensuite je veux lors de mon identification dans le formulaire, comparé mon mot de passe clair et le hashé.
Mon code :

Code : Tout sélectionner

<?php /*Si les variables sont définies */ $login = isset($_POST['login']) ? $_POST['login'] : ''; $psw = isset($_POST['psw']) ? $_POST['psw'] : ''; // On se connecte à la Bdd try { $bdd = new PDO('mysql:host=localhost;dbname=lpa;charset=utf8', 'root', 'root'); } catch (Exception $e) { die('Erreur de connection à la Bdd : ' . $e->getMessage()); } // On récupère tout le contenu de la table $reponse = $bdd->query('SELECT * FROM users WHERE login = "'.$login.'"'); $row = $reponse->fetch(); $id = $row['id'];/*[0]*/ $log = $row['login'];/*[1]*/ $pass = $row['psw'];/*[2]*/ if($login == '' OR $login !== $log) { /*la requete ne retourne aucun résultat pour ce login*/ /*header*/ echo('Location: /essai/index.php?error=1'); } elseif ($pass !== password_verify($psw, $pass)) { /*header*/ echo('Location: /essai/index.php?error=2&psw='.$psw); } else { session_start(); /*sinon on demarre la session*/ $_SESSION['login'] = $login; $_SESSION['psw'] = $psw; $_SESSION['logged'] = true; header('Location: /essai/session/session-bienvenu.php'); } ?>
J'utilise pour cela, password_verify. Mais je dois mi prendre très mal. Je suis bloqué.

Eléphant du PHP | 116 Messages

16 mai 2018, 14:46

c'est bon ça fonctionne avec ce code :

Code : Tout sélectionner

<?php /*Si les variables sont définies */ $login = isset($_POST['login']) ? $_POST['login'] : ''; $psw = isset($_POST['psw']) ? $_POST['psw'] : ''; // On se connecte à la Bdd try { $bdd = new PDO('mysql:host=localhost;dbname=lpa;charset=utf8', 'root', 'root'); } catch (Exception $e) { die('Erreur de connection à la Bdd : ' . $e->getMessage()); } // On récupère tout le contenu de la table $reponse = $bdd->query('SELECT * FROM users WHERE login = "'.$login.'"'); $row = $reponse->fetch(); $id = $row['id'];/*[0]*/ $log = $row['login'];/*[1]*/ $pass = $row['psw'];/*[2]*/ if($login !== $log) { /*la requete ne retourne aucun résultat pour ce login*/ header('Location: /essai/index.php?error=1'); } /*On vérifie le password*/ elseif (!password_verify($psw, $pass)) { header('Location: /essai/index.php?error=2&psw='.$psw); } else { session_start(); /*sinon on demarre la session*/ $_SESSION['login'] = $login; $_SESSION['psw'] = $psw; $_SESSION['logged'] = true; header('Location: /essai/page/bienvenu.php'); } ?>