Hello !
J'ai un leger souci d'affichage de notification de type "Identifiant ou mot de passe incorrecte" ou encore "Vous êtes maintenant connecté".
login.php :
<?php
require_once 'inc/functions.php';
reconnect_from_cookie();
if(isset($_SESSION['auth'])){
header('Location: account.php');
exit();
}
if(!empty($_POST) && !empty($_POST['username']) && !empty($_POST['password'])){
require_once 'inc/db.php';
$req = $pdo->prepare('SELECT * FROM users WHERE (username = :username OR email = :username) AND confirmed_at IS NOT NULL');
$req->execute(['username' => $_POST['username']]);
$user = $req->fetch();
if(password_verify($_POST['password'], $user->password)){
$_SESSION['auth'] = $user;
$_SESSION['flash']['success'] = 'Vous êtes maintenant connecté';
if($_POST['remember']){
$remember_token = str_random(250);
$pdo->prepare('UPDATE FROM users SET remember_token = ? WHERE id = ?')->execute([$remember_token, $user->id]);
setcookie('remember', $user->id . '==' . $remember_token . ($user->id . 'ratonlaveurs'), time() + 60 * 60 * 24 * 7);
}
header('Location: account.php');
exit();
}else{
$_SESSION['flash']['danger'] = 'Identifiant ou mot de passe incorrecte';
}
}
?>
<form action="" method="POST">
<h1>Connexion</h1>
<div>
<label for="">Nom d'utilisateur ou E-mail</label>
<input type="text" name="username"/>
</div>
<div>
<label>Mot de passe <a href="forget.php">(J'ai oublié mon mot de passe)</a></label>
<input type="password" name="password"/>
</div>
<div">
<label>
<input type="checkbox" name="remember" value="0"/> Se souvenir de moi
</label>
</div>
<button type="submit">Connexion</button>
</form>
J'aimerai que les notifications d'erreur ou de succées puissent s'afficher normalement, mais le problème est assez délicat car il concerne aussi toutes les pages fonctionnant avec des notifications. :/
db.php :
<?php
$pdo = new PDO('mysql:dbname=**************************;host=***************', '********', '***');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
functions.php :
<?php
function debug($variable){
echo '<pre>' . print_r($variable, true) . '</pre>';
}
function str_random($length){
$alphabet = "0123456789azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN";
return substr(str_shuffle(str_repeat($alphabet, $length)), 0, $length);
}
function logged_only(){
if(session_status() == PHP_SESSION_NONE){
session_start();
}
if(!isset($_SESSION['auth'])){
$_SESSION['flash']['danger'] = "Vous n'avez pas le droit d'accéder à cette page";
header('Location: login.php');
exit();
}
}
function reconnect_from_cookie(){
if(session_status() == PHP_SESSION_NONE){
session_start();
}
if(isset($_COOKIE['remember']) && !isset($_SESSION['auth']) ){
require_once 'inc/db.php';
if(!isset($pdo)){
global $pdo;
}
$remember_token = $_COOKIE['remember'];
$parts = explode('==', $remember_token);
$user_id = $parts[0];
$req = $pdo->prepare('SELECT * FROM users WHERE id = ?');
$req->execute([$user_id]);
$user = $req->fetch();
if($user){
$expected = $user_id . '==' . $user->remember_token . sha1($user_id . 'ratonlaveurs');
if($expected == $remember_token){
session_start();
$_SESSION['auth'] = $user;
setcookie('remember', $remember_token, time() + 60 * 60 * 24 * 7);
} else{
setcookie('remember', null, -1);
}
}else{
setcookie('remember', null, -1);
}
}
}
Si il manque des codes pour examiner le problème n'hesitez pas !
Merci,
Yo!
Pourquoi ne pas afficher ce que tu as en session au début de ta page et l'effacer directement? Du genre :
if(isset($_SESSION['flash']['success'])){
echo $_SESSION['flash']['success'];
unset($_SESSION['flash']['success']);
}
Salut Golgotha, pour répondre à ta question j'ai des notification du style "Vous êtes maintenant connecté" lorsque je remplis le formulaire de connexion, un peu comme sur Grafikart.fr, la notifiaction (verte) lorsque l'ont se connecte et j'ai le même type de notification sur le site que je suis entrain de realisé, hors toutes les notifications fonctionnais correctement avant que j'applique les CSS et les autres pages, avec le header etc etc... Et la c'est le drâme...... Plus aucune notif ne répond.. Aucune n'indique par exemple "Un email de confirmation vous à étais envoyée afin de confirmer votre adresse mail"... Elle n'apparaissent plus...
Merci houceni pour ta réponse, je vais essayer de suite !
Merci beaucoup houceni, sa à résolu mon problème... Tout bêtement, mais je ne comprend toujours pas pourquoi les notifications ont décidée de me bouder au point de ne plus s'afficher du jour au lendemain ^^
N'êmpeche que ta réponse à étais éffica et je t'en remercie !
Voici mon nouveau login.php au cas où quelqu'un aurais le même problème que moi ^^ :
<?php
require_once 'inc/functions.php';
reconnect_from_cookie();
if(isset($_SESSION['auth'])){
header('Location: account.php');
exit();
}
if(!empty($_POST) && !empty($_POST['username']) && !empty($_POST['password'])){
require_once 'inc/db.php';
$req = $pdo->prepare('SELECT * FROM users WHERE (username = :username OR email = :username) AND confirmed_at IS NOT NULL');
$req->execute(['username' => $_POST['username']]);
$user = $req->fetch();
if(password_verify($_POST['password'], $user->password)){
$_SESSION['auth'] = $user;
$_SESSION['flash']['success'] = 'Vous êtes maintenant connecté';
if($_POST['remember']){
$remember_token = str_random(250);
$pdo->prepare('UPDATE FROM users SET remember_token = ? WHERE id = ?')->execute([$remember_token, $user->id]);
setcookie('remember', $user->id . '==' . $remember_token . ($user->id . 'ratonlaveurs'), time() + 60 * 60 * 24 * 7);
}
header('Location: account.php');
exit();
}else{
$_SESSION['flash']['danger'] = 'Identifiant ou mot de passe incorrecte';
}
}
?>
<form action="" method="POST">
<h1>Connexion</h1>
<div>
<label for="">Nom d'utilisateur ou E-mail</label>
<input type="text" name="username"/>
</div>
<div>
<label>Mot de passe <a href="forget.php">(J'ai oublié mon mot de passe)</a></label>
<input type="password" name="password"/>
</div>
<div">
<label>
<input type="checkbox" name="remember" value="0"/> Se souvenir de moi
</label>
</div>
<button type="submit">Connexion</button>
<?php if(isset($_SESSION['flash']['success'])){
echo $_SESSION['flash']['danger'];
unset($_SESSION['flash']['danger']);
} ?>
</form>