Bonjour,

Voila je rencontre un petit problème avec mon code. Je voudrais faire un système d'abonnement pour bloquer l'accès à des utilisateurs. Pour l'instant j'ai bien un système de connexion et un blocage s'ils sont actifs ou pas (0 ou 1)
Cependant, il faudrait limiter la connexion à 2 ans, et donc passer automatiquement en mode inactif un utilisateur.

Mon fichier Auth :

<?php class Auth{

    var $forbiddenPage = "./forbidden.php";

    /**
    * Permet d'identifier un utilisateur
    **/
    function login($d){
        global $PDO; 
        $req = $PDO->prepare('SELECT users.id,users.prenom,users.address,users.nom,roles.name,roles.slug,roles.level, users.active,users.dateFin FROM users LEFT JOIN roles ON users.role_id=roles.id WHERE address=:address AND password=md5(:password) AND active=1' );
        $req->execute($d); 
        $data = $req->fetchAll();

        if(count($data)>0){
                $_SESSION['Auth'] = $data[0]; 
                return true;
        }
        return false;
    }   

    /**
     * Autorise un rang à accéder à une page, redirige vers forbidden sinon
     * */
    function allow($rang){
        global $PDO; 
        $req = $PDO->prepare('SELECT slug,level  FROM roles');
        $req->execute(); 
        $data = $req->fetchAll();
        $roles = array(); 
        foreach($data as $d){
            $roles[$d->slug] = $d->level; 
        }
        if(!$this->user('slug')){
            $this->forbidden(); 
        }else{
            if($roles[$rang] > $this->user('level')){
                $this->forbidden(); 
            }else{
                return true;
            }
        }

    }

    /**
     * Récupère une info utilisateur
     ***/
    function user($field){
        if($field == 'role') $field = 'slug'; 
        if(isset($_SESSION['Auth']->$field)){
            return $_SESSION['Auth']->$field;
        } else{
            return false; 
        }
    }

    /**
     * Redirige un utilisateur
     * */
    function forbidden(){
        header('Location:'.$this->forbiddenPage);
    }

}

$Auth = new Auth();

J'ai ajouté une colonne dateFin dans ma base pour insérer une date de fin à un enregistrement, mais je ne vois pas comment limiter la date de l'abonnement.
je suppose qu'il faut que Date('d/m/Y')<=$dateFin, mais je ne vois pas comment l'ajouter à mon fichier Auth.

Pensez-vous pouvoir m'aiguiller ?

Merci! :)

14 réponses


mirael86
Auteur
Réponse acceptée

Alors c'est bon, j'ai la solution...

J'avais en effet un soucis de d'appellation de ma variable $dateFin!! je ne comprenais pas comment l'appeler et comme c'est de l'objet, il suffisait de mettre "$data[0]->dateFin"

Pour ceux que ça interesse :

  function login($d){
        global $PDO; 
        $req = $PDO->prepare('SELECT users.id,users.prenom,users.address,users.nom,users.active,users.dateFin,roles.name,roles.slug,roles.level FROM users LEFT JOIN roles ON users.role_id=roles.id WHERE address=:address AND password=md5(:password) AND active=1' );
        $req->execute($d); 
        $data = $req->fetchAll();

        //echo $data['dateFin'];

        if(count($data)>0){
           if (strtotime(date('d/m/Y')) > strtotime($data[0]->dateFin)){
                $this->erreur_date = "Votre identifiant n'est pas actif.<br>Veuillez contacter l'administrateur";
            //header('location:forbidden.php');
                return false;
            }
            else{
                $_SESSION['Auth'] = $data[0]; 
                return true;
            }
        }

        $this->erreur_date = "Votre identifiant ou mot de passe n'est pas correct.";
        return false;

    }   

Merci pour votre aide et d'avoir pris un peu de votre temps pour moi! :)

Bonjour,

Selon moi tu devrais prendre la date d'aujourd'hui (au moment de l'inscription).
et dans ton code mettre une condition :
Tant que date d'inscription est inférieur a date de fin continuer l'accès au site.
sinon lui interdire.

Tu peux t'aider de la fonction now dans ta requete SQL pour mettre la date d'aujourd'hui.

Tu dois utiliser cette fonction dans une requête INSERT.

tu doit pouvoir faire un check comme ca

if (time() >= strtotime($user->dateFin)){
    // interdit car maintenant est superieur a sa date de fin
}
mirael86
Auteur

@keulu = J'ai essayé de faire comme tu m'a proposé, mais rien ne s'affiche...
Je pense que j'ai déconné quelque part... je ne suis pas très calé en PHP alors ça va surement sembler absurde! :)

function login($d){
        global $PDO; 
        $req = $PDO->prepare('SELECT users.id,users.prenom,users.address,users.nom,roles.name,roles.slug,roles.level, users.active,users.dateFin FROM users LEFT JOIN roles ON users.role_id=roles.id WHERE address=:address AND password=md5(:password) AND active=1' );
        $req->execute($d); 
        $data = $req->fetchAll();

        if(count($data)>0){
            if (time() >= strtotime($user->dateFin)){
                $query  = "UPDATE users SET active=0 WHERE active='$active'";
                $query  -> execute($t);
                $time = $query->fetchAll();
                return false;
            }
            else{
                $_SESSION['Auth'] = $data[0]; 
                return true;
            }
        }

        return false;

    }

Je me suis dis, si la date de fin est inférieur ou égale à la date courante, alors je fais un UPDATE de ma colonne active... mais on ne doit pas pouvoir le faire comme ça!! lol

mirael86
Auteur

J'ai modifié le code pour qu'en fin de compte ça ne change pas la colonne actif... car pas besoin en fait!! lol

j'ai donc ça :


var $forbiddenPage = "./forbidden.php";
    Public $erreur_date = "";

    /**
    * Permet d'identifier un utilisateur
    **/
    function login($d){
        global $PDO; 
        $req = $PDO->prepare('SELECT users.id,users.prenom,users.address,users.nom,roles.name,roles.slug,roles.level, users.active,users.dateFin FROM users LEFT JOIN roles ON users.role_id=roles.id WHERE address=:address AND password=md5(:password) AND active=1' );
        $req->execute($d); 
        $data = $req->fetchAll();

        if(count($data)>0){
            if (date('m/d/Y') >= $Auth->dateFin){
                $this->erreur_date = "Votre identifiant n'est pas actif.<br>Veuillez contacter l'administrateur";
                return false;
            }
            else{
                $_SESSION['Auth'] = $data[0]; 
                return true;
            }
        }
        $this->erreur_date = "Votre identifiant ou mot de passe n'est pas correct.";
        return false;

    }

Mais si la date est dépassée, ça ne me connecte pas du tout... je ne comprends pas!! :(

ouais mais la tu va avoir un soucis. t'essaie de comparer 2 strings ^^

date('d/m/Y') te retourne qqch comme 05/02/2016
alors que Auth->dateFin (qui viens de la bdd genre collonne type date ou datetime ?)
va te retourner qqch comme 2018-05-02

et surtout, dans ton code, si la date est passé, tu marque une erreur, tu ne log pas le mec, alors c'est normal que tu soit pas loggé :)

mirael86
Auteur

En fait dans ma base, j'enregistre dateFin de cette manière :

<?php
$dateDepart             = date("d/m/Y");
$duree                  = 2;
$dateDepartTimestamp    = strtotime($dateDepart);
$_POST['dateFin']       = date('m/d/Y', strtotime('+'.$duree.' year', $dateDepartTimestamp ));
?>

Ce qui me retourne la date du jour + 2 ans = 05/02/2018

c'est pour ça que j'ai comparé les deux dates de cette manière.

Oui, en effet je ne veux pas logger l'utilisateur si la date est passée. C'est fait pour bloquer la connexion, et ne pas donner accès au contenu du site.

Je comprends qu'on ne puisse pas comparer 2 string du coup..., mais, est ce qu'il existe une fonction qui permet de comparer deux dates ?

mirael86
Auteur

J'ai fais un strtodate sur ma date courante et je l'ai soustraite à strtodate('$dateFin'). Voilà comment j'ai fais :

if(count($data)>0){
            if (strtotime(date('d/m/Y')) - strtotime($this->user('dateFin')) == 0){
                $this->erreur_date = "Votre identifiant n'est pas actif.<br>Veuillez contacter l'administrateur";
                return false;
            }
            else{
                $_SESSION['Auth'] = $data[0]; 
                return true;
            }
        }
        $this->erreur_date = "Votre identifiant ou mot de passe n'est pas correct.";
        return false;

Par contre ça ne fonctionne pas! quelqu'un peut m'expliquer porquoi je peux me me connecter dans tous les cas ??

Merci

mirael86
Auteur

Hey les gens!! s'il vous plait je deviens fou moi!!

regardez mes fichiers :
class.auth.php :

<?php class Auth{

    var $forbiddenPage = "./forbidden.php";
    Public $erreur_date = "";

    /**
    * Permet d'identifier un utilisateur
    **/
    function login($d){
        global $PDO; 
        $req = $PDO->prepare('SELECT users.id,users.prenom,users.address,users.nom,roles.name,roles.slug,roles.level, users.active,users.dateFin FROM users LEFT JOIN roles ON users.role_id=roles.id WHERE address=:address AND password=md5(:password) AND active=1' );
        $req->execute($d); 
        $data = $req->fetchAll();

        if(count($data)>0){
            if (time() >= strtotime($this->user('dateFin'))){
                $this->erreur_date = "Votre identifiant n'est pas actif.<br>Veuillez contacter l'administrateur";
                return false;
            }
            else{
                $_SESSION['Auth'] = $data[0]; 
                return true;
            }
        }
        $this->erreur_date = "Votre identifiant ou mot de passe n'est pas correct.";
        return false;

    }   

    /**
     * Autorise un rang à accéder à une page, redirige vers forbidden sinon
     * */
    function allow($rang){
        global $PDO; 
        $req = $PDO->prepare('SELECT slug,level  FROM roles');
        $req->execute(); 
        $data = $req->fetchAll();
        $roles = array(); 
        foreach($data as $d){
            $roles[$d->slug] = $d->level; 
        }
        if(!$this->user('slug')){
            $this->forbidden(); 
        }else{
            if($roles[$rang] > $this->user('level')){
                $this->forbidden(); 
            }else{
                return true;
            }
        }

    }

    /**
     * Récupère une info utilisateur
     ***/
    function user($field){
        if($field == 'role') $field = 'slug'; 
        if(isset($_SESSION['Auth']->$field)){
            return $_SESSION['Auth']->$field;
        } else{
            return false; 
        }
    }

    /**
     * Redirige un utilisateur
     * */
    function forbidden(){
        header('Location:'.$this->forbiddenPage);
    }

}

$Auth = new Auth();

mon fichier header.php

<?php
include 'includes/bdd_connect.php';
session_start();
if(!empty($_POST)){
  if($Auth->login($_POST)){
    if($Auth->user('role') === 'admin'){
      header('location:./admin/index.php');
    }elseif($Auth->user('role') === 'contrib'){
      header('location:index.php');
    }elseif($Auth->user('role') === 'member'){
      header('location:index.php');
    }
  }
  else{
    $error_message= '<div class="fatal_error">'.$Auth->erreur_date.'</div>';
  }
}

?>

mon fichier connexion.php

<?php echo $error_message ?>
            <form class="module_connex" action="" method="POST" id="connect-form">
                <input type="text" name="address" placeholder="entrez votre adresse email"><br>
                <input type="password" name="password" placeholder="entrez votre mot de passe"><br>
                <input type="submit" value="Connexion" class="btn btn-bleu">
            </form>

par rapport à ces fichiers, je voudrai juste bloquer les connexion pour ceux qui ont une $dateFin < date actuelle!!

J'ai l'impression que je ne suis pas loin mais je n'y arrive pas!!

Siouplait... pouvez-vous m'aider ?

Merci

Salut, j'ai juste lu ton dernier post :

 if (strtotime(date('d/m/Y')) - strtotime($this->user('dateFin')) == 0){

ton user('dateFin') il est sous format Européen ? D M Y ou américain M D Y ? Si tu veux pouvoir comparer 2 dates, il faut qu'elles soient au même format avec le même séparateur, eg : si dateFin a d-m-Y, l'autre comparaison doit être d-m-Y, ça plus le fait que ton comparateur == 0 , tu veux pas plutôt ?

 if ( strtotime(date('d/m/Y') ) > strtotime(str_replace('/', '-', $this->user('dateFin'))  ){

Les négatifs retournent true en php

mirael86
Auteur

Je crois que j'ai trouvé d'où vient le problème, mais je n'arrive pas à le régler.
J'ai essayé de faire un echo de ma dateFin, et ça n'affiche rien...

Est-ce-que vous savez pourquoi "$this->user->dateFin" ne me retourne rien alors que je l'appel dans ma requête ?
Je remets mon code :

var $forbiddenPage = "./forbidden.php";
    Public $erreur_date = "";

    /**
    * Permet d'identifier un utilisateur
    **/
    function login($d){
        global $PDO; 
        $req = $PDO->prepare('SELECT users.id,users.prenom,users.address,users.nom,users.active,users.dateFin,roles.name,roles.slug,roles.level FROM users LEFT JOIN roles ON users.role_id=roles.id WHERE address=:address AND password=md5(:password) AND active=1' );
        $req->execute($d); 
        $data = $req->fetchAll();

        if(count($data)>0){
           if (strtotime(date('d/m/Y') ) > strtotime($this->user->dateFin)){
                $this->erreur_date = '<p>Votre abonnement est terminé depuis le <strong>'.$this->user->dateFin.'</strong></p>';
                return false;
            }
            else{
                $_SESSION['Auth'] = $data[0]; 
                return true;
            }
        }
        $this->erreur_date = "Votre identifiant ou mot de passe n'est pas correct.";
        return false;

    }   

Comment tu hydrates ta classe user ? et pourquoi tu passes de $this->user('dateFin') à $this->user->dateFin ? Comment $this->user est défini ? c'est un model? pas de getters pour appeler $this->user->properties ?

$dateDepart = date("d/m/Y"); // ca c'est bien en francais, mais pas en informatique.
$dateDepartTimestamp = strtotime($dateDepart); // ca va te retourner un truc pas correcte. donc tout le reste de ton calcul est foireux

met plutot $dateDepart = date("Y-m-d"); // format americain ;)

pour ne pas s'égarer utilise mktime (); c'est du standard partout