Bonjour,

Voila je rencontre un petit problème avec mon code depuis pas mal de jours...

Ce que je fais

J'ai suivi les tuto pour la gestion de compte et la refactoriasation. J'ai juste ajouté le champ prénom (firstname) et le pseudo lors de l'inscription.

Voici le register.php

<?php 
require 'inc/bootstrap.php'; 

// Je veux récupérer le premier utilisateur

if (!empty($_POST)) {

    $errors = array();

    $db = App::getDatabase();
    $validator = new Validator($_POST);
    $validator->isAlpha('name', "Votre nom n'est pas valide (alphanumériquement) !");
    $validator->isAlpha('firstname', "Votre prénom n'est pas valide (alphanumériquement) !");
    $validator->isAlpha('pseudo', $db, 'membres', "Votre pseudo n'est pas valide !");
    if ($validator->isValid()) {
        $validator->isUniq('pseudo', $db, 'membres', "Ce pseudo est déjà utilisée pour un autre compte !");
    }
    $validator->isEmail('email', $db, 'membres', "Votre Email n'est pas valide !");
    if ($validator->isValid()) {
        $validator->isUniq('email', $db, 'membres', "Cette adresse Email est déjà utilisée pour un autre compte !");
    }
    $validator->isConfirmed('password', "Votre mot de passe n'est pas valide !");

    if ($validator->isValid()) {
        App::getAuth()->register($db, $_POST['name'], $_POST['firstname'], $_POST['pseudo'], $_POST['password'], $_POST['email']);
        Session::getInstance()->setFlash('success', "Un Email de confirmation vous a été envoyé pour valider votre compte !");
        App::redirect('login.php');
    }else{
        $errors = $validator->getErrors();
    }

}

?>

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

<br>
<h1>S'inscrire</h1>
<hr>

<?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">
            <input type="text" name="name" class="form-control" placeholder="Nom" required>
    </div>

    <div class="form-group">
            <input type="text" name="firstname" class="form-control" placeholder="Prénom" required>
    </div>

    <div class="form-group">
            <input type="text" name="pseudo" class="form-control" placeholder="Pseudo" required>
    </div>

    <div class="form-group">
            <input type="text" name="email" class="form-control" placeholder="Email" required>
    </div>

    <div class="form-group">
            <input type="password" name="password" class="form-control" placeholder="Mot de passe" required>
    </div>

    <div class="form-group">
            <input type="password" name="password_confirm" class="form-control" placeholder="Confirmez le mot de passe" required>
    </div>

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

</form>

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

Voici le confirm.php

<?php
require 'inc/bootstrap.php';
$db = App::getDatabase();
$auth = new Auth();

if(App::getAuth()->confirm($db, $_GET['id'], $_GET['token'], Session::getInstance())){
    Session::getInstance()->setFlash('success', "Votre compte a bien été validé !");
    App::redirect('account.php');
}else{
    Session::getInstance()->setFlash('danger', "Ce token n'est plus valide...");
    App::redirect('login.php');
}

Voici le Auth.php

<?php
class Auth{

    private $options = [
        'restriction_msg' => "Vous n'avez pas le droit d'accéder à cette page !"
    ];
    private $session;

    public function __construct($session, $options = []){
        $this->options = array_merge($this->options, $options);
        $this->session = $session;
    }

    public function hashPassword($password){
        return password_hash($password, PASSWORD_BCRYPT);
    }

    public function register($db, $name, $firstname, $pseudo, $password, $email){
        $password = $this->hashPassword($password);
        $token = Str::random(60);
        $db->query("INSERT INTO membres SET name = ?, firstname = ?, pseudo = ?, password = ?, email = ?, confirmation_token = ?", [
            $name, 
            $firstname,
            $pseudo, 
            $password, 
            $email, 
            $token
        ]);
        $user_id = $db->lastInsertId();
        mail($email, 'Confirmation de votre compte', "Afin de valider votre compte merci de cliquer sur ce lien\n\nhttp://localhost/forum_blog/comptes/confirm.php?id=$user_id&token=$token");  
    }

    public function confirm($db, $user_id, $token){
        $user = $db->query('SELECT * FROM membres WHERE id = ?', [$user_id])->fetch();

        if($user && $user->confirmation_token == $token){
            $db->query('UPDATE membres SET confirmation_token = NULL, confirmed_at = NOW() WHERE id = ?', [$user_id]);
            $this->session->write('auth', $user);
            return true;
        }
        return false;
    }

    public function restrict(){
        if (!$this->session->read('auth')) {
            $this->session->setFlash('danger', $this->options['restriction_msg']);
            header('Location: login.php');
            exit();
        }
    }

    public function user(){
        if (!$this->session->read('auth')) {
            return false;
        }
        return $this->session->read('auth');
    }

    public function connect($user){
        $this->session->write('auth', $user);
    }

    public function connectFromCookie($db){
        if (isset($_COOKIE['remember']) && !$this->user()) {
            $remember_token = $_COOKIE['remember'];
            $parts = explode('==', $remember_token);
            $user_id = $parts[0];
            $user = $db->query('SELECT * FROM membres WHERE id = ?', [$user_id])->fetch();
            if ($user) {
                $expected = $user_id . '==' . $user->remember_token . sha1($user_id . 'ratonlaveurs');
                if ($expected == $remember_token) {
                    $this->connect($user);
                    setcookie('remember', $remember_token, time() + 60 * 60 * 24 * 7);
                }else{
                    setcookie('remember', null, -1);
                }
            }else{
                setcookie('remember', null, -1);
            }
        }
    }

    public function login($db, $email, $password, $remember = false){
        $user = $db->query('SELECT * FROM membres WHERE (email = :email) AND confirmed_at IS NOT NULL', ['email' => $email])->fetch();
        if(!empty($user) && password_verify($password, $user->password)){
            $this->connect($user);
            if ($remember) {
                $this->remember($db, $user->id);
            }
            return $user;
        }else{
            return false;
        }
    }

    public function remember($db, $user_id){
        $remember_token = Str::random(250);
        $db->query('UPDATE membres SET remember_token = ? WHERE id = ?', [$remember_token, $user_id]);
        setcookie('remember', $user_id . '==' . $remember_token . sha1($user_id . 'ratonlaveurs'), time() + 60 * 60 * 24 * 7);
    }

    public function logout(){
        setcookie('remember', NULL, -1);
        $this->session->delete('auth');
    }

    public function resetPassword($db, $email){
        $user = $db->query('SELECT * FROM membres WHERE email = ? AND confirmed_at IS NOT NULL', [$email])->fetch();
        if($user){
            $reset_token = Str::random(60);
            $db->query('UPDATE membres SET reset_token = ?, reset_at = NOW() WHERE id = ?', [$reset_token, $user->id]);
            mail($_POST['email'], 'Réinitialisation de votre mot de passe', "Afin de réinitialiser votre mot de passe merci de cliquer sur ce lien\n\nhttp://localhost/forum_blog/comptes/reset.php?id={$user->id}&token=$reset_token");
            return $user;
        }
        return false;
    }

    public function checkResetToken($db, $user_id, $token){ 
        return $db->query('SELECT * FROM membres WHERE id = ? AND reset_token IS NOT NULL AND reset_token = ? AND reset_at > DATE_SUB(NOW(), INTERVAL 30 MINUTE)', [$user_id, $token])->fetch();
    }
}

Ce que je veux

Je voulais faire la même chose que dans la vidéo de Grafikart, sauf rajouté lors de l'inscription le prénom et un pseudo.

Ce que j'obtiens

Je reçois bien le mail avec le lien pour valider le compte, je le copies colle et voici l'erreur que j'ai :

Fatal error: Uncaught ArgumentCountError: Too few arguments to function Auth::construct(), 0 passed in D:\wamp64\www\Forum_Blog\comptes\confirm.php on line 4 and at least 1 expected in D:\wamp64\www\Forum_Blog\comptes\class\Auth.php on line 9
( ! ) ArgumentCountError: Too few arguments to function Auth::
construct(), 0 passed in D:\wamp64\www\Forum_Blog\comptes\confirm.php on line 4 and at least 1 expected in D:\wamp64\www\Forum_Blog\comptes\class\Auth.php on line 9

Ca fait 2 jours que j'essaie de trouver une solution mais je ne trouve rien.
Si je comprends bien il n'y a pas assez d'argument pour la fonction construct mais je ne comprends pas ce qu'il me manque...

Merci de votre aide ! Bonne journée à vous :)

1 réponse


Bonjour.
L'erreur est logique, pour instancier la classe Auth, il te faut lui passer au moins un argument sur deux ($session), sauf que tu instancies la classe en ne lui passant aucun argument.
Autre chose, pour la méthode confirm, tu passe en troisième argument l'instance de la session alors que la méthode attend une chaîne de caractères, soit le token.