Partage
  • Partager sur Facebook
  • Partager sur Twitter

Remplacer une variable fixe par une donné de bdd

    20 juin 2018 à 17:17:38

    Bonjour à tous,

    Je suis débutant en programmation et j'aurai besoin d'aide sur le problème suivant que je rencontre et dont je cherche la solution depuis plus d'une semaine.

    J'ai réalisé dans un premier temps un espace membre qui fonctionne parfaitement est dont le code est le suivant :

    <?php
    require_once 'inc/functions_04.php';
    reconnect_from_cookie();
    if(isset($_SESSION['auth'])){
        header('Location: account_04.php');
        exit();
    }
    // ###  Vérification de connection ###
    if(!empty($_POST) && !empty($_POST['username']) && !empty($_POST['password'])){
        require_once 'inc/db_04.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é';
    
    // ###  Se souvenir de moi ###
    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 . 'monaccia'), time() + 60 * 60 * 24 * 7);
    }
    
    // ### On va à la page du compte utilisateur ###
            header('Location: account_04.php');
            exit();
        }else{
            $_SESSION['flash']['danger'] = 'Identifiant ou mot de passe incorrect';
        }
    }
    ?>
    <?php
    if(session_status() == PHP_SESSION_NONE){
        session_start();
    }
    ?>

    Je souhaiterais ajouté une fonction d'abonnement à ce code.
    Cet abonnement sur 13 mois doit finir à une date fixe donné par ma base de données dans la colonne "abon_end"

    J'ai donc réalisé la fonction suivante :

    <?php
    // Ajouter/soustraire une période à une date
    function periode_date(){
    
    $aujourdhui = new DateTime(); // Date du jour auto
    $date_fin  = new DateTime('31-03-2018'); // A remplacer par une donnée (abon_end) de la bdd ???????
    $temps_abonnement = new DateInterval('P13M'); // L'abonnement à une validité de 13 mois
    
    if($aujourdhui->sub($temps_abonnement) < $date_fin) 
    	{     
        	echo 'Votre abonnement est à jour'; // Si la date du jour est < à la date de lancement (Ne rien mettre pour que le programme continue)
    	}
    	else
    	{
        	echo 'Veuillez renouveller votre abonnement'; // Si la date du jour est > à la date de lancement
    	}
    }
    ?>

    Ce que je n'arrive pas à faire c'est d'incorporer cette fonction au système de login et de replacer la variable fixe $date_fin = new DateTime('31-03-2018'); par la donnée de la colonne (abon_end) correspondant à l'utilisateur de la bdd.

    J'espère avoir été clair.

    Merci d'avance pour vos réponse.

    • Partager sur Facebook
    • Partager sur Twitter
      20 juin 2018 à 17:28:02

      Bonjour,

      Ce serait beaucoup plus simple de mettre la date de début d'abonnement dans la BDD, et de vérifier directement en SQL dans la requête si la date d'aujourd'hui est supérieure à la date enregistrée + 13 mois.

      • Partager sur Facebook
      • Partager sur Twitter
        20 juin 2018 à 17:45:09

        Bonjour philodick,

        Je vais te dire, peut-être, mais vu mes connaissances en programmation tu me poses un nouveau dilemme o_O 

        J'ai déjà eu du mal à réaliser et faire fonctionner cette fonction sur 13 mois, alors que me proposes-tu ?

        • Partager sur Facebook
        • Partager sur Twitter
          20 juin 2018 à 20:51:00

          Merci philodick,

          je vais regarder ça, mais ouf !!! cela à été laborieux, je viens de résoudre l'un de mes problèmes, l'incorporation de ma fonction d'abonnement dans mon programme de login.

          Il me reste le problème de la variable $date_fin  = new DateTime('31-03-2018'); qui doit être appelé depuis la bdd et là je suis perdu. J'ai tenté plusieurs solutions mais rien à faire.

          Voici mon nouveau code :

          <?php
          require_once 'inc/functions_04.php';
          reconnect_from_cookie();
          if(isset($_SESSION['auth'])){
              header('Location: account_04.php');
              exit();
          }
          // ###  Vérification de connection ###
          if(!empty($_POST) && !empty($_POST['username']) && !empty($_POST['password'])){
              require_once 'inc/db_04.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();
                  
          // Variables d'abonnement
              $aujourdhui = new DateTime(); // Date du jour auto
              $date_fin  = new DateTime('31-03-2017'); // A remplacer par une donnée (abon_end) de la bdd ???????
              //$pdo->prepare(SELECT * FROM users WHERE (username = :username OR abon_end = :username) AND confirmed_at IS NOT NULL); 
              $temps_abonnement = new DateInterval('P13M');
          // Vérification mot de passe et abonnement    
              if(password_verify($_POST['password'], $user->password) AND ($aujourdhui->sub($temps_abonnement) < $date_fin)){
              	$_SESSION['auth'] = $user;
              
          $_SESSION['flash']['success'] = 'Vous êtes maintenant connecté';
          
          // ###  Se souvenir de moi ###
          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 . 'monaccia'), time() + 60 * 60 * 24 * 7);
          }
                  header('Location: account_04.php');
                  exit();
              }else{
                  $_SESSION['flash']['danger'] = 'Identifiant ou mot de passe incorrect. A moins que votre abonnement ne soit pas à jour !';
              }
          }
          ?>

          Merci pour votre aide.

          • Partager sur Facebook
          • Partager sur Twitter
            20 juin 2018 à 20:56:15

            $date_fin  = new DateTime($user['abon_end'])
            Mais bon, à mon avis, comme j'ai dit précédemment, tu réinventes la roue.
            • Partager sur Facebook
            • Partager sur Twitter
              21 juin 2018 à 16:56:47

              Bonjour philodick et merci pour tes réponses,

              J'ai étudié TIMESTAMPDIFF() function comme tu me l'avais conseillé. En fait si j'ai bien compris avec cette fonction on compare une date de départ à une date d'arrivée ou en cours et on peut calculer le nombre de mois écoulés en ajoutant MONTH dans la fonction.

              Fonction au demeurant intéressante et que je retiens pour un prochain développement, mais qui quelque part revient au même à ce que je fais, en ce qui concerne le résultat, et demande, quoi qu'il en soit, qu'il y ait une date définie dans la base de données.

              La dernière solution que tu m'as donnée pour récupérer une date de ma base de donnée comme variable

              $date_fin  = new DateTime($user['abon_end']);

              me revoie :

              Fatal error: Uncaught Error: Cannot use object of type stdClass as array in /Volumes/HD_Donnees/Site_Internet/htdocs/tomato/login_04.php:18 Stack trace: #0 {main} thrown in /Volumes/HD_Donnees/Site_Internet/htdocs/tomato/login_04.php on line 17

              J'ai fait des recherches sur cette Fatal error et je n'ai rien trouvé pour résoudre ce problème.

              J'ai donc essayé une autre façon d'écrire :

              $date_fin = $user->abon_end;

              Là le programme va jusqu'au résultat, mais il me renvoi, que la date soit valide ou pas, que celle-ci n'est pas valable.

              Je me demande si cela ne viendrait pas du format de la date de la base de donnée qui est en anglais (année, mois, jour) et que ma date du jour serait au format français (jour, mois, année). Si c'est le cas je ne vois pas comment faire pour résoudre ce nouveau problème.

              C'est un vrai casse tête cette histoire...
              Merci d'avance pour une réponse qui pourrait débloquer mon problème.

              • Partager sur Facebook
              • Partager sur Twitter
                21 juin 2018 à 18:06:40

                La grosse différence c'est que tu fais tout en SQL, pas besoin de recalculer derrière en Php. Mais bon à toi de voir.

                Pour le reste, tu veux dire que ceci te dit que la date n'est pas valable ? :

                	
                $date_fin  = new DateTime($user->abon_end);



                -
                Edité par philodick 21 juin 2018 à 18:09:36

                • Partager sur Facebook
                • Partager sur Twitter
                  21 juin 2018 à 19:03:33

                  lol alors je n'ai pas bien compris le fonctionnement de TIMESTAMPDIFF().

                  Ça fait un mois que je développe en PHP alors je nage encore...

                  Pour l'appelle à la base de données 

                  $date_fin  = new DateTime($user->abon_end);

                  ou

                  $date_fin  = new DateTime($user['abon_end']);

                  me renvoie

                  Fatal error: Uncaught Error: Cannot use object of type stdClass as array in /Volumes/HD_Donnees/Site_Internet/htdocs/tomato/login_04.php:18 Stack trace: #0 {main} thrown in /Volumes/HD_Donnees/Site_Internet/htdocs/tomato/login_04.php on line 17 

                  Je ne comprends pas pourquoi

                  Vraiment désolé de te solliciter une fois de plus.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    21 juin 2018 à 19:08:39

                    Tu dois fetcher par défaut tes résultat en objets, donc ça peut être logique pour la deuxième version, par contre, ça ne me paraît pas possible pour la première.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      21 juin 2018 à 19:27:37

                      Dans mon code je fetch en ligne 13 

                      $user = $req->fetch();

                      Par ailleurs et tu avais raison la première fonction, j'avais oublié de passer en commentaire la seconde

                      C'est super cool ça fonctionne parfaitement, je ne sais pas comment te remercier, mille merci(ssssss....) :honte:

                      Serait-il possible de pouvoir garder le contacte au cas où je rencontrerais de nouvelles difficultés ? en sachant que je cherche vraiment la solution au problème avant d'appeler au secours.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        21 juin 2018 à 20:41:54

                        Tu auras toujours une réponse ici (tant que tu arrives à expliquer ton problème ;) )
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Remplacer une variable fixe par une donné de bdd

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown