Bonjour, j'ai suivi le tuto de Grafikart sur "la création d'un compte utilisateur" et il semble que moi j'ai commis des erreurs dans mes codes, des erreurs que je n'arrive pas à corriger d'abord. J'ai donc besoin d'aide pour les résoudre!
1) Primo, actuellement lorsque je m'inscris, je reçois le mail de validation dans mon dossier spam au lieu de le recevoir directement dans ma boîte de reception.
2) Deuxièmement, après la validation du compte, lorsque j’essaie de me connecter à travers la page "login.php", je n'y arrive pas, à moins que je coche l'option "se souvenir de moi" qui est relative au cookies. Alors que je dois normalement pouvoir me connecter sans cookie, et, avec cookie lorsque je le voudrai.
3) Lorsque je m'inscris avec un 2eme compte, je n'arrive pas à me connecter avec ce dernier, si ce n'est le 1er.
En effet, le code est subdivisé en plusieurs pages que voici:
1) La page "register.php"
2) La page "login.php"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99 <?php require_once 'inc/functions.php'; session_start(); if(!empty($_POST)) { $errors=array(); require_once 'inc/db.php'; if(empty($_POST['username']) || !preg_match('/^[a-zA-Z0-9_]+$/', $_POST['username'])) { $errors['username'] = "Votre pseudo n'est pas valide (alphanumérique)"; } else { $req = $pdo->prepare("SELECT id FROM users WHERE username = ? "); $req->execute([$_POST['username']]); $user = $req->fetch(); if($user) { $errors['username'] = "Ce pseudo est deja pris"; } } if(empty($_POST['email']) || !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) { $errors['email'] = "Votre email n'est pas valide"; } else { $req = $pdo->prepare("SELECT id FROM users WHERE email = ? "); $req->execute([$_POST['email']]); $user = $req->fetch(); if($user) { $errors['email'] = "Cet email est deja utilisé pour un autre compte"; } } if(empty($_POST['password']) || $_POST['password'] != $_POST['password_confirm']) { $errors['password'] = "Vous devez rentrer un mot de passe valide"; } if(empty($errors)) { $req = $pdo->prepare("INSERT INTO users SET username = ?, password = ?, email = ?, confirmation_token= ?"); $password = password_hash($_POST['password'], PASSWORD_BCRYPT); $token = str_random(60); $req->execute([$_POST['username'], $password , $_POST['email'], $token]); $user_id = $pdo -> lastInsertId(); mail($_POST['email'], 'Confirmation de votre compte', "Afin de valider votre compte, merci de cliquersur ce lien\n\nhttp://localhost/comptes/confirm.php?id=$user_id&token=$token"); $_SESSION['flash']['success'] = "Un email de confirmation vous a été envoyé pour valider votre compte"; header('Location:login.php'); exit(); } } ?> <?php require 'inc/header.php'; ?> <h1>S'inscrire</h1> <?php if(!empty($errors)): ?> <div class="alert alert-danger"> <p>Vous n'avez pas rempli le formulaire correctement</p> <ul> <?php foreach($errors as $error): ?> <li><?= $error ?></li> <?php endforeach; ?> </ul> </div> <?php endif; ?> <form action="" method="POST"> <div class="form-group"> <label for="">Pseudo</label> <input type="text" name="username" class="form-control"/> </div> <div class="form-group"> <label for="">Email</label> <input type="text" name="email" class="form-control"/> </div> <div class="form-group"> <label for="">Mot de passe</label> <input type="password" name="password" class="form-control"/> </div> <div class="form-group"> <label for="">Confirmez votre mot de passe</label> <input type="password" name="password_confirm" class="form-control"/> </div> <button type="submit" class="btn-btn primary">M'inscrire</button> </form> <?php require 'inc/footer.php'; ?>
3) La page "account.php"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 <?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 users SET remember_token = ? WHERE id = ?')->execute([$remember_token, $user->id]); setcookie('remember', $user->id . '==' . $remember_token . sha1($user->id . 'ratonlaveurs'), time() + 60 * 60 * 24 * 7); } header('Location: account.php'); exit(); }else{ $_SESSION['flash']['danger'] = 'Identifiant ou mot de passe incorecte'; } } ?> <?php require_once 'inc/header.php'; ?> <h1>Se connecter</h1> <form action="" method="POST"> <div class="form-group"> <label for="">Pseudo ou Email</label> <input type="text" name="username" class="form-control"/> </div> <div class="form-group"> <label for="">Mot de passe <a href="forget.php">(J'ai oublié mon mot de passe)</a></label> <input type="password" name="password" class="form-control"/> </div> <div class="form-group"> <label> <input type="checkbox" name="remember" value="1"/> Se souvenir de moi </label> </div> <button type="submit" class="btn-btn primary">Se connecter</button> </form> <?php require_once 'inc/footer.php'; ?>
4) La page "logout.php"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 <?php $user_id=$_GET['id']; $token=$_GET['token']; require 'inc/db.php'; $req = $pdo->prepare('SELECT * FROM users WHERE id = ?'); $req->execute([$user_id]); $user = $req->fetch(); session_start(); if($user&&$user->confirmation_token == $token) { $pdo->prepare('UPDATE users SET confirmation_token = NULL, confirmed_at = NOW() WHERE id = ?')->execute([$user_id]); $_SESSION['flash']['success'] = "Votre compte a bien été validé"; $_SESSION['auth'] = $user; header('Location: account.php'); } else { $_SESSION['flash']['danger'] = "Ce token n'est plus valide"; header('Location: login.php'); }
5) La page "reset.php"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 <?php session_start(); setcookie('remember', NULL, -1); unset($_SESSION['auth']); $_SESSION['flash']['success'] = "Vous êtes maintenant déconnecté"; header('location: login.php');
6) La page "confirm.php"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 <?php if(isset($_GET['id']) && isset($_GET['token'])) { require 'inc/db.php'; require 'inc/functions.php'; $req = $pdo->prepare('SELECT * FROM users WHERE id = ? AND reset_token IS NOT NULL AND reset_token = ? AND reset_at > DATE_SUB(NOW(), INTERVAL 30 MINUTE)'); $req->execute([$_GET['id'], $_GET['token']]); $user = $req->fetch(); if($user) { if(!empty($_POST)) { if(!empty($_POST['password']) && $_POST['password'] == $_POST['password_confirm']) { $password = password_hash($_POST['password'], PASSWORD_BCRYPT); $pdo->prepare('UPDATE users SET password = ?, reset_at = NULL, reset_token = NULL')->execute([$password]); session_start(); $_SESSION['flash']['success'] = 'Votre mot de passe a bien été modifié'; $_SESSION['auth'] = $user; header('Location: account.php'); exit(); } } }else { session_start(); $_SESSION['flash']['danger'] = "Ce token n'est pas valide"; header('Location: login.php'); exit(); } } else { header('Location: login.php'); exit(); } ?> <?php require_once 'inc/header.php'; ?> <h1>Réinitialiser mon mot de passe</h1> <form action="" method="POST"> <div class="form-group"> <label for="">Mot de passe</label> <input type="password" name="password" class="form-control"/> </div> <div class="form-group"> <label for="">Confirmation du mot de passe</label> <input type="password" name="password_confirm" class="form-control"/> </div> <button type="submit" class="btn-btn primary">Réinitialiser votre mot de passe</button> </form> <?php require_once 'inc/footer.php'; ?>
7) La page de connexion à la base de données "db.php"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 <?php $user_id=$_GET['id']; $token=$_GET['token']; require 'inc/db.php'; $req = $pdo->prepare('SELECT * FROM users WHERE id = ?'); $req->execute([$user_id]); $user = $req->fetch(); session_start(); if($user&&$user->confirmation_token == $token) { $pdo->prepare('UPDATE users SET confirmation_token = NULL, confirmed_at = NOW() WHERE id = ?')->execute([$user_id]); $_SESSION['flash']['success'] = "Votre compte a bien été validé"; $_SESSION['auth'] = $user; header('Location: account.php'); } else { $_SESSION['flash']['danger'] = "Ce token n'est plus valide"; header('Location: login.php'); }
8) La page des fonctions "functions.php"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 <?php $pdo = new PDO('mysql:dbname=comptes; host:localhost', 'root', ''); $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo ->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
9) La page "header.php"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65 <?php function debug($variable) { echo '<pre>'.print_r($variable, true).'</pre>'; } function str_random ($length) { $alphabet = "123456789azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN"; 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'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); } } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63 <?php if(session_status() == PHP_SESSION_NONE); { session_start(); } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="x-ua-compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- The above 3 meta tags ... --> <meta name="description" content=""> <link rel="icon" href="../../favicon.ico"> <title> Mon super projet </title> <!-- BOOTSTRAP CORE CSS --> <link rel="stylesheet" href="css/app.css"> </head> <body> <nav class="navbar navbar-inverse"> <div class="container"> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar"> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> <a class="navbar-brand" href="#">Mon super projet</a> </button> </div> <div id="navbar" collapse navbar-collapse> <ul class="nav navbar-nav"> <?php if(isset($_SESSION['auth'])): ?> <li><a href="logout.php">Se déconnecter</a></li> <?php else: ?> <h4>Mon super projet</h4> <li> <a href="register.php">S'inscrire</a></li> <li> <a href="login.php">Se connecter</a></li> <?php endif; ?> </ul> </div> </div> </nav> <div class="container"> <?php if(isset($_SESSION['flash'])) : ?> <?php foreach($_SESSION['flash'] as $type => $message): ?> <div class="alert alert<?= $type; ?>"> <?= $message; ?> </div> <?php endforeach; ?> <?php unset($_SESSION['flash']); ?> <?php endif; ?>
Partager