Bonjour,

Voila j'ai rencontré plusieurs problèmes en essayant de suivre le tutoriel pour la gestion membre.

Ce que je fais

Bon alors moi tout ce que je fais c'est copier le code(seulement pour un test) dans la vidéo.
Voici le script que j'ai réalisé;

header.php

<?php
 require_once 'inc/functions.php'; 
 session_start();
 if(!empty($_POST)){

$error = 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($users){
        $errors['username'] = 'Ce pseudo est déjà 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($users){
        $errors['email'] = 'Cet email est déjà 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 cliquer sur ce lien\n\nhttp://local/login/confirm.php?id=$user_id&token=$token");
    $_SESSION['flash']['sucess'] = '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 rentré 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="confirm_password" class="form-control" />
</div>

<button type="submit" class="btn btn-primary">M'inscrire</button>

</form>

<?php require 'inc/footer.php';?>

footer.php

</div>
</body>
</html>

register.php

<?php
require_once 'inc/functions.php'; 
session_start();
if(!empty($_POST)){

$error = 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($users){
        $errors['username'] = 'Ce pseudo est déjà 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($users){
        $errors['email'] = 'Cet email est déjà 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 cliquer sur ce lien\n\nhttp://local/login/confirm.php?id=$user_id&token=$token");
    $_SESSION['flash']['sucess'] = '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 rentré 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="confirm_password" class="form-control" />
</div>

<button type="submit" class="btn btn-primary">M'inscrire</button>

</form>

<?php require 'inc/footer.php';?>

login.php

<?php
require_once 'inc/function.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_start();
    $_SESSION['auth'] = $user;
    $_SESSION['flash']['sucess'] = '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 . 'raton-laveurs'), time() + 60 * 60 * 24 * 7);
    }
    header('Location: account.php');
    exit();
}else{
    $_SESSION['flash']['danger'] = 'Identifiant ou mot de passe incorrect';
}
}
?>
<?php require 'inc/functions.php';?>
<?php require '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"></a>(J'ai oublié mon mot de passe)</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 debug($_SESSION) ?>

<?php require 'inc/footer.php'; ?>

confirm.php

 <?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){
$req = 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'] = "Votre token n'est plus valide."
header('Location:login.php');
}

account.php

 <?php 
require 'inc/functions.php';
logged_only();
if(!empty($_POST)){

if(!empty($_POST['password']) || $_POST['password'] != $_POST['password_confirm']){
    $_SESSION['flash']['danger'] = "Les mots de passe ne correspondent pas.";
}else{
    $user_id = $_SESSION['auth']->id;
    $passsword= password_hash($_POST['password'], PASSWORD_BCRYPT);
    require_once 'inc/db.php';
    $req = $pdo->prepare('UPDATE users SET password = ?')->execute(['$password, $user_id']);
    $_SESSION['flash']['sucess'] = "Votre mot de passe a bien été mis à jour."
}

}
require 'inc/header.php'; 
?>

<h1>Bonjour <?= $_SESSION['auth']->username; ?></h1>

<form action="" method="POST">
    <div class="form-group">
        <input class= "form-control" type="password" name="password" placeholder="Changer de mot de passe"/>
    </div>
    <div class="form-group">
        <input class="form-control" type="password" name="password_confirm" placeholder="Confirmation du mot de passe"/>
    </div>
    <button class="btn btn-primary">Changer mon mot de passe<button>
</form>

<?php require 'inc/footer.php'; ?>

functions.php

<?php
function debug($variable){
echo '<pre>' . print_r($variable, true) . '</pre>';
}

function str_random($lenght){
$alphabet ="0123456789azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN";
return substr(str_shuffle(str_repeat($alphabet, $lenght)), 0,$lenght);
}

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 . 'raton-laveurs');
        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);
    }
}
}

db.php

<?php
$pdo = new PDO('mysql:dbname=tuto;host=localhost', 'root', 'root');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ATTR_ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);

logout.php

<?php
$pdo = new PDO('mysql:dbname=tuto;host=localhost', 'root', 'root');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ATTR_ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);

forget.php

<?php
if(!empty($_POST) && !empty($_POST['email'])){
require_once 'inc/db.php';
require_once 'inc/function.php';
$req = $pdo->prepare('SELECT * FROM users WHERE email = ? AND confirmed_at IS NOT NULL');
$req->execute([$_POST['email']]);
$user = $req->fetch();
if($user){
    session_start();
    $reset_token = str_random(60);
    $pdo->prepare('UPDATE users SET reset_token = ?, reset_at = NOW() WHERE id = ?')->execute(['reset_token, $user->id']);
    $_SESSION['flash']['sucess'] = 'Les instructions du rappel de mot de passe vous ont été envoyées par email.';
    mail($_POST['email'], 'Réinitialisement de votre mot de passe.', "Afin de réinitialiser votre mot de passe merci de cliquer sur ce lien\n\nhttp://local/login/reset.php?id={$user->id}&token=$reset_token");
    header('Location: login.php');
    exit();
}else{
    $_SESSION['flash']['danger'] = 'Aucun compte correspond à cette adresse.';
}
}
?>
<?php require 'inc/functions.php';?>
<?php require 'inc/header.php'; ?>

<h1>Mot de passe oublié</h1>

<form action="" method="POST">

<div class="form-group">
   <label for="">Email</label>
   <input type="email" name="email" class="form-control" />
</div>

<button type="submit" class="btn btn-primary">Se connecter</button>

</form>

<?php debug($_SESSION) ?>

<?php require 'inc/footer.php'; ?>

reset.php

 <?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']['sucess'] = "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 'inc/header.php'; ?>

<h1>Rénitialiser 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 de 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 debug($_SESSION) ?>

<?php require 'inc/footer.php'; ?>

Ce que je veux

Dans ce tutoriel, tout ce que je cherchai à faire c'est d'apprendre à faire un espace membre. C'est pourquoi je copie le code pour mieu comprendre ce que je fais.

Ce que j'obtiens

Bon, il y a plusieurs erreurs qui s'arrivent lorsque j'essais d'accéder à mes pages à partir de wamp;

  1. Lorsque j'essais d'entrer dans la page register.php, on me dit;

Parse error: syntax error, unexpected 'endif' (T_ENDIF) in C:\wamp\www\login\register.php on line 64

  1. Lorsque j'essais d'entrer dans la page login.php, on me dit;

Parse error: syntax error, unexpected 'IS' (T_STRING) in C:\wamp\www\login\login.php on line 10

  1. Lorsque j'essais d'entrer dans la page account.php, on me dit;

Parse error: syntax error, unexpected '}' in C:\wamp\www\login\account.php on line 14

  1. Lorsque j'essais d'entrer dans la page confirm.php, on me dit;

Parse error: syntax error, unexpected '$req' (T_VARIABLE) in C:\wamp\www\login\confirm.php on line 5

  1. Lorsque j'essais d'entrer dans la page forget.php, on me dit;

Parse error: syntax error, unexpected 'endforeach' (T_ENDFOREACH) in C:\wamp\www\login\inc\header.php on line 55

J'ai vérifié à plusieurs reprises le code que j'ai tapé et la vidéo que l'on me montrait et il correspondait exactement cependant on m'affiche cette erreur et je ne comprends pas vraiment ce qu'on m'essait de dire. Est-ce que quelqu'un peut m'expliquer? Merci d'avance pour vos réponses.

8 réponses


Khovann
Réponse acceptée

Hello,

C'est assez explicite, tu as un champ dans ta table users qui n'a pas de valeur par défaut (ça au pire c'est pas grave) mais qui n'est pas nullable (Au niveau de ton champ, c'est indiqué Null : Non, ce qui veut dire qu'il est considéré comme obligatoire). Donc lorsque MySQL va essayer d'insérer une nouvelle entrée dans la table (ce qu'il fait l.40 de ton fichier), il va se rendre compte qu'il n'a pas de valeur à mettre dans la colonne reset_token et te renvoyer un erreur, en toute logique.
Il te suffit de rendre le champ non obligatoire, en changeant ses propriétés (tu pourrais également lui mettre une valeur par défaut à "", mais c'est moins propre). Ca fait longtemps que j'ai pas utilisé phpmyadmin, mais à priori en cliquant sur "modifier" dans la structure de ta table, tu devrais trouver ton bonheur.

Bonne journée !

(edit 2016-04-01 01:04)
Bonsoir,

Ce que tu vois c'est les erreurs d'exécution de PHP, généralement liées à une erreur de syntaxe, ou de variable non existante.
Le code que tu as collé dans ta question comprend des erreurs (et du coup ne doit pas correspondre à celui qu'on voit dans la vidéo je ne pense pas que Graf' soit malicieux au point de laisser des erreurs dans le code qu'il affiche pour forcer les gens à comprendre ce qu'ils font). Par exemple pour le fichier register.php, il y a :

Parse error: syntax error, unexpected 'endif' (T_ENDIF) in C:\wamp\www\login\register.php on line 64

Donc le réflexe c'est d'aller voir à la ligne 64 : un endif non attendu. En remontant on voit que ton if est mal déclaré, tu as <?php if(!empty($errors)); ?> le point-virgule devrait être un deux-points (pour plus d'info regarde ici ).

Les autres erreurs sont sûrement de la même trempe (guillemet fermé trop vite sur ta requête SQL à la ligne 10 par exemple)

A mon avis, tu ne maitrises pas encore suffisamment les bases de PHP, donc juste copier le code (avec des erreurs) ne va pas t'être utile, il faut que tu t'entraines avec des exercices de syntaxe de base et que tu lises le code que tu essaies de faire fonctionner, en comprenant comment il se découpe.
Et en vrai, recopier un code non compris est au mieux inutile, au pire dangereux.

Bon courage dans ton apprentissage :)

Bonjour,

Tu fais souvent des erreurs de frappe en recopiant le code comme par exemple dans ton fichier header tu écris cela:

$user = $req->fetch();
if($users){
    $errors['username'] = 'Ce pseudo est déjà pris.';
}

au lieu de:
    $user = $req->fetch();
if($user){
    $errors['username'] = 'Ce pseudo est déjà pris.';
}

La variable user stocke le résultat de $req->fetch, mais tu utilises une variable $users qui elle ne contient rien.
Reprend calmement ton code en revoyant souvant cette vidéo. Moi personnellement j'ai du la voir au moins 10 fois et je trouve ce tuto excellent, je l'utilise même dans mon petit frameworks MVC que je me suis fais avec les formation de Jonathan de GRAFIKART.

Bonne relecture et bon courage.

Alain

Bonjour, j'ai commencé en effet à corriger mes erreurs de syntaxes. Je suis bloqué sur quelques-uns et j'espère que vous pouve m'aider.
Lorsque j'essaie d'accéder à la page register.php, on m'affiche cette erreur;

Parse error: syntax error, unexpected 'endforeach' (T_ENDFOREACH) in C:\wamp\www\login\inc\header.php on line 55

Lorsque j'essaie de rentrer dans la page login.php, on m'affiche cette erreur;

Fatal error: Cannot redeclare debug() (previously declared in C:\wamp\www\login\inc\functions.php:2) in C:\wamp\www\login\inc\functions.php on line 4

Lorsque j'essaie de rentrer dans la page confirm.php, on m'affiche ces erreurs;

Notice: Undefined index: id in C:\wamp\www\login\confirm.php on line 2
Notice: Undefined index: token in C:\wamp\www\login\confirm.php on line 3
Fatal error: Undefined class constant 'ATTR_ERRMODE_EXCEPTION' in C:\wamp\www\login\inc\db.php on line 3

Ensuite, lorsque j'essaie de rentrer dans la page account.php, on m'affiche cette erreur;

Parse error: syntax error, unexpected '}' in C:\wamp\www\login\account.php on line 14

Lorsque j'essaie de rentrer dans la page forget.php, on m'affiche cette erreur;

Parse error: syntax error, unexpected 'endforeach' (T_ENDFOREACH) in C:\wamp\www\login\inc\header.php on line 55

Puis voici mon code qui a été mise à jour pour corriger mes erreurs de syntaxe.
register.php
<?php
require_once 'inc/functions.php';
session_start();
if(!empty($_POST)){

$error = 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 déjà 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($users){
        $errors['email'] = 'Cet email est déjà 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 cliquer sur ce lien\n\nhttp://local/login/confirm.php?id=$user_id&token=$token");
    $_SESSION['flash']['sucess'] = '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 rentré 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="confirm_password" class="form-control" />
</div>

<button type="submit" class="btn btn-primary">M'inscrire</button>

</form>

<?php require 'inc/footer.php';?>

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_start();
$_SESSION['auth'] = $user;
$_SESSION['flash']['sucess'] = '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 . 'raton-laveurs'), time() + 60
60 24 7);
header('Location: account.php');
exit();
}
}else{
$_SESSION['flash']['danger'] = 'Identifiant ou mot de passe incorrect';
}
}
?>
<?php require 'inc/functions.php';?>
<?php require '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"></a>(J'ai oublié mon mot de passe)</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 debug($_SESSION) ?>

<?php require 'inc/footer.php'; ?>

confirm.php
<?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'] = "Votre token n'est plus valide.";
header('Location:login.php');
}

account.php
<?php
require 'inc/functions.php';
logged_only();
if(!empty($_POST)){

if(!empty($_POST['password']) || $_POST['password'] != $_POST['password_confirm']){
    $_SESSION['flash']['danger'] = "Les mots de passe ne correspondent pas.";
}else{
    $user_id = $_SESSION['auth']->id;
    $passsword= password_hash($_POST['password'], PASSWORD_BCRYPT);
    require_once 'inc/db.php';
    $req = $pdo->prepare('UPDATE users SET password = ?')->execute(['$password, $user_id']);
    $_SESSION['flash']['sucess'] = "Votre mot de passe a bien été mis à jour."
}

}
require 'inc/header.php'; 
?>

<h1>Bonjour <?= $_SESSION['auth']->username; ?></h1>

<form action="" method="POST">
    <div class="form-group">
        <input class= "form-control" type="password" name="password" placeholder="Changer de mot de passe"/>
    </div>
    <div class="form-group">
        <input class="form-control" type="password" name="password_confirm" placeholder="Confirmation du mot de passe"/>
    </div>
    <button class="btn btn-primary">Changer mon mot de passe<button>
</form>

<?php require 'inc/footer.php'; ?>

db.php
<?php
$pdo = new PDO('mysql:dbname=tuto;host=localhost', 'root', 'root');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ATTR_ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);

header.php
<?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 must come first in the head; any other head content must come after these tags -->
<meta name="description" content="">
<meta name="author" content="">
<link rel="icon" href="../../favicon.ico">

<title>Mon super projet</title>

<!-- Bootstrap core CSS -->
<link href="css/app.css" rel="stylesheet">
</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" aria-expanded="false" aria-controls="navbar">
        <span class="sr-only">Toggle navigation</span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <a class="navbar-brand" href="#">Mon super projet</a>
    </div>
    <div id="navbar" class="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: ?>
            <li><a href="register.php">S'inscrire</a></li>
            <li><a href="login.php">Se connecter</a></li>
        <?php endif; ?>
      </ul>
    </div><!--/.nav-collapse -->
  </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; ?>

forget.php
<?php
if(!empty($_POST) && !empty($_POST['email'])){
require_once 'inc/db.php';
require_once 'inc/function.php';
$req = $pdo->prepare('SELECT * FROM users WHERE email = ? AND confirmed_at IS NOT NULL');
$req->execute([$_POST['email']]);
$user = $req->fetch();
if($user){
session_start();
$reset_token = str_random(60);
$pdo->prepare('UPDATE users SET reset_token = ?, reset_at = NOW() WHERE id = ?')->execute(['reset_token, $user->id']);
$_SESSION['flash']['sucess'] = 'Les instructions du rappel de mot de passe vous ont été envoyées par email.';
mail($_POST['email'], 'Réinitialisement de votre mot de passe.', "Afin de réinitialiser votre mot de passe merci de cliquer sur ce lien\n\nhttp://local/login/reset.php?id={$user->id}&token=$reset_token");
header('Location: login.php');
exit();
}else{
$_SESSION['flash']['danger'] = 'Aucun compte correspond à cette adresse.';
}
}
?>
<?php require 'inc/functions.php';?>
<?php require 'inc/header.php'; ?>

<h1>Mot de passe oublié</h1>

<form action="" method="POST">

<div class="form-group">
   <label for="">Email</label>
   <input type="email" name="email" class="form-control" />
</div>

<button type="submit" class="btn btn-primary">Se connecter</button>

</form>

<?php debug($_SESSION) ?>

<?php require 'inc/footer.php'; ?>

J'espère que vous puissiez m'aider à comprendre ces erreurs de syntaxes et un merci en avance!

essaie de mettre ":" à la place du ";" à la ligne 55 de ton header.

   <?php foreach($_SESSION['flash'] as $type => $message): ?>

Le point virgule définit la fin d'une instruction. Quand tu fais un foreach dans ton code php la fin de l'instruction du foreach, c'est endforeach; . Tu mets ":" pour mettre en "pause" dans php. Tu reprends ton html et ensuite tu ouvres de nouveau php et tu fini ton instruction foreach.

De manière général, quand t'as un message d'erreur qui te dit qu'il y a un problème dans le fichier header.php à la ligne 55 et bien il faut aller regarder. Rien ne sert de reparcourir l'intégralité de tes fichiers.

++

Bonjour,
J'ai corrigé plusieurs des erreurs de syntaxe que j'ai eu. Maintenant, il me reste plus que cette erreur dans functions.php qui me dit;

Fatal error: Cannot redeclare debug() (previously declared in C:\wamp\www\login\inc\functions.php:2) in C:\wamp\www\login\inc\functions.php on line 4

Voici mon code;

functions.php

            <?php
            function debug($variable){
                echo '<pre>' . print_r($variable, true) . '</pre>';
            }

            function str_random($lenght){
                $alphabet ="0123456789azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN";
                return substr(str_shuffle(str_repeat($alphabet, $lenght)), 0,$lenght);
            }

            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 . 'raton-laveurs');
                    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);
            }
        }
        }

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_start();
                    $_SESSION['auth'] = $user;
                    $_SESSION['flash']['sucess'] = '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 . 'raton-laveurs'), time() + 60 * 60                              * 24 * 7);
                        header('Location: account.php');
                        exit();
                     }
                }else{
                    $_SESSION['flash']['danger'] = 'Identifiant ou mot de passe incorrect';
                }
            }
            ?>
            <?php require 'inc/functions.php';?>
            <?php require '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"></a>(J'ai oublié mon mot de passe)</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 debug($_SESSION) ?>

            <?php require 'inc/footer.php'; ?>

Bon, je ne sais pas vraiment ce qu'on m'essait de dire. Est-ce que quelqu'un peut m'aider? Merci d'avance.

Bonjour,
J'ai modifié ma page login.php et je suis parvenu à accéder finalement à ma page de connexion. Pour tester, j'ai rentrer les champs requis. Après avoir cliqué sur "m'inscrire", je suis atterri sur la page avec ce message;

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 1364 Field 'reset_token' doesn't have a default value' in C:\wamp\www\login\register.php on line 40

PDOException: SQLSTATE[HY000]: General error: 1364 Field 'reset_token' doesn't have a default value in C:\wamp\www\login\register.php on line 40

J'ai vérifié la table dans ma base de donnée qui aurait l'air de ça;

Voici mon code dans la page register.php

            <?php
            require_once 'inc/functions.php'; 
            session_start();
            if(!empty($_POST)){

                $error = 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 déjà 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 déjà 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 cliquer sur ce lien\n\nhttp://local/login/confirm.php?id=$user_id&token=$token");
                    $_SESSION['flash']['sucess'] = '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 rentré 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';?>

Alors là je suis vraiment perdu parce que je ne comprends pas vraiment ce que ce qui veut me dire. J'aimerai que quelqu'un m'explique plus clairement. Merci d'avance!

Merci, j'ai configuré le champ reset_token à Null ainsi que le champ remember_token et tout fonctionne!