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;
- 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
- 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
- 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
- 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
- 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.