Incrementer tous les jours en PHP [Résolu]

Signaler
Messages postés
202
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
19 septembre 2020
-
Messages postés
202
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
19 septembre 2020
-
Bonjour, je voudrai établir un système de décrémenter le nombre des jours à partir d'une heure donnée(23:00pm),
Voici la partie de mon code concernée:


// Connexion dans la table time
try
    {		
 $req2 = $bdd->prepare('SELECT * FROM time WHERE id = ?');
	
	$req2->execute(array($_SESSION["id"]));
			 
	 }
    catch(Exception $e)
    {
        die('Erreur : '.$e->getMessage());
    }
$dom = $req2->fetch(); 	
			
$delai = $dom['duree']; $code = $dom['code'];	
			
		
$heure = date("g:i a");	

//Condition de décrémentation		 
	while($req2->fetch() ) {				
					
	if($delai != 0 ) {
		
	if ($heure == "23:00 pm") {
		
	$delai = $delai - 1;
		
	$sql = 'UPDATE time SET duree = ?   WHERE id = ?';
$datas = array($delai, $_SESSION["id"]);
try{
  $req = $bdd->prepare($sql);
  $req->execute($datas);  
} catch ( Exception $e ) {
    // en cas d'erreur :
    echo " Erreur ! " . $e->getMessage ();
    print_r ( $datas );
    exit;
  }		
		
$i =1;	
	while($heure != "23:01 pm" ) {	$i++; }// dès qu'il décrémente il fait une minute dans la boucle jusqu'à 23: 01 pm
		
		
	}
		
	$heure = date("g:i a");		

	 } 	
		
   } 


Le constat que j'ai fait c'est que mon code n'excute pas après l'heure prévu, le nombre de jour est le même, quelqu'un peut-il me dire ce qui coince avec mon code ? SVP

9 réponses

Messages postés
13142
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 novembre 2020
732
bonjour,
peux-tu rendre ton code plus lisible en respectant les conventions d'alignement?
je suggère que tu ajoutes des echo pour que tu comprennes ce que fait ton code.
ta boucle en ligne 43 me semble bizarre, la condition ne change jamais.
Messages postés
202
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
19 septembre 2020

// Connexion dans la table time
try
    {  
 $req2 = $bdd->prepare('SELECT * FROM time WHERE id = ?');
 
 $req2->execute(array($_SESSION["id"]));
    
  }
    catch(Exception $e)
    {
        die('Erreur : '.$e->getMessage());
    }
$dom = $req2->fetch();  
   
$delai = $dom['duree']; $code = $dom['code']; 
   
  
$heure = date("g:i a"); 


//Condition de décrémentation   
while($req2->fetch() ) {    
if($delai != 0 ) {
if ($heure == "23:00 pm") {
  
$delai = $delai - 1;
$sql = 'UPDATE time SET duree = ?   WHERE id = ?';
$datas = array($delai, $_SESSION["id"]);
try{
  $req = $bdd->prepare($sql);
  $req->execute($datas);  
} catch ( Exception $e ) {
    // en cas d'erreur :
    echo " Erreur ! " . $e->getMessage ();
    print_r ( $datas );
    exit;
  }  
 

 
$i =1;
// la boucle while est là pour faire passer 1min afin qu'il ne refasse plus le test de $heure == "23:00 pm" 
while($heure != "23:01 pm" ) { $i++; }
}
$heure = date("g:i a");  
 }  
}


Jai séparé les instructions, j'espère que c'est plus comprehensible
Messages postés
13142
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 novembre 2020
732
je suggère que tu ajoutes des echo pour que tu comprennes ce que fait ton code.
ta boucle en ligne 43 me semble bizarre, la condition ne change jamais.
pour rendre ton code lisible, vois ici: https://gist.github.com/npotier/593b645025173ef8bbb5c59d3fd455fa
Messages postés
202
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
19 septembre 2020
>
Messages postés
13142
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 novembre 2020

C'est fait exprès, c'est pour eviter que la condition
 if ($heure == "23:00 pm")
s'exécute pendant les 1 minutes. Je bloque ma condition
 if ($heure == "23:00 pm")
avec la boucle WHILE, pour que dès que ça sera 23:01 pm, il va sortir de
 if ($heure == "23:00 pm")
et attendre la prochaine 23:01 pm, je sais pas si tu m'a compris?

Ce que j'ai remarqué c'est que c'est comme si la condition
 if ($heure == "23:00 pm")
s'execute pas
Messages postés
13142
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 novembre 2020
732 >
Messages postés
202
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
19 septembre 2020

as-tu ajouté des echo pour t'aider à comprendre ce que fait ton code?
par exemple:
echo $heure;
avant le if de la ligne 24.
Messages postés
13142
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 novembre 2020
732 >
Messages postés
202
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
19 septembre 2020

la condition de la boucle while ne change pas dans la boucle: si tu y rentres, tu ne vas jamais en sortir.
Messages postés
30193
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2020
2 981
Bonjour,

Si tu avais fait ce qu'Yg_be t'avait conseillé ( mettre des echo dans ton code pour essayer de comprendre ce qui ne fonctionne pas) et qu'en plus tu avais pris soin de bien lire ce qu'il t'a indiqué ( la condition ne change jamais.)
. tu aurais pu constater que ta variable $heure, vu qu'elle se trouve en dehors de ta boucle .. ne change pas !
Et donc.. que ta condition IF se basera TOUJOURS sur l'heure qu'il était lorsque tu as affiché ta page....


Messages postés
202
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
19 septembre 2020

Oui tu as raison, le fait que la variable $heure soit dehors empêche l'execution de ma boucle comme j'aurai souhaité.
Merci
Messages postés
13142
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 novembre 2020
732
je pense que ton code est très loin de faire ce que tu souhaites.
cependant, tu n'expliques pas ce que tu veux réaliser.
Messages postés
30193
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2020
2 981
Surtout qu'un script PHP a une certaine "durée" de vie.... et à moins de forcer le set_time_limit à une durée excessive ( à ne surtout pas faire !!! ) ... le script s'arrêtera avant d'avoir atteint l'heure souhaitée.
Messages postés
13142
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 novembre 2020
732
si je devine ce que tu veux réaliser, il est préférable d'enregistrer des moments, pas des délais.
Messages postés
202
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
19 septembre 2020

La variable delais contient le nombre de jours, le but de mon programme c'est que le nombre de jours se décrémente à une heure donnée, puis s'actualise dans la base de donnée, puis lorsqu'il arrive dans la boucle
while($heure != "10:54 am" ) { $i++; } 
il comptabilise le nombre de $i dans le but de faire passer le temps et ne plus exécuté
if ($heure == "10:53 am")


y
    {  
 $req2 = $bdd->prepare('SELECT * FROM time WHERE id = ?');
 
 $req2->execute(array($_SESSION["id"]));
    
  }
    catch(Exception $e)
    {
        die('Erreur : '.$e->getMessage());
    }
  
//calcul delai  
while($req2->fetch() ) {
$heure = date("g:i a"); 

 $delai = $dom['duree'];  
  
 $heure = date("g:i a"); 
     
 if($delai != 0 ) {
  
 if ($heure == "10:53 am") {
  
 $delai = $delai - 1;
  
 $sql = 'UPDATE time SET duree = ?   WHERE id = ?';
$datas = array($delai, $_SESSION["id"]);
try{
  $req = $bdd->prepare($sql);
  $req->execute($datas);  
} catch ( Exception $e ) {
    // en cas d'erreur :
    echo " Erreur ! " . $e->getMessage ();
    print_r ( $datas );
    exit;
  }  
  
$i =1; 
 while($heure != "10:54 am" ) { $i++; }  
 echo $i ; 
 }
  } 

   } 



J'ai mis la variable $heure à l'intérieur et je met les echo pour comprendre ce qui se passe dans la boucle, le onstat c'est qu' apparement la condition
 f ($heure == "10:53 am") 
voilà pourquoi il n'ya pas décrémentation
Quelqu'un peut-il m'aidé SVP?
Messages postés
13142
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 novembre 2020
732
as-tu fait comme expliqué en #5?

en tous cas, tu n'as pas change la boucle en ligne 40, la condition n'y change jamais.

je pense que ton code est très loin de faire ce que tu souhaites.
cependant, tu n'expliques pas ce que tu veux réaliser.
Messages postés
202
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
19 septembre 2020

Oui j'ai ajouté un
 echo $heure;
, s'affiche dans la boucle WHILE mais la condition IF ne s'exécute pas

Comme j'ai expliqué précédemment, la ligne 40 est mis expressément, c'est pour que la condition
 if ($heure == "10:53 am")
s'exécute qu'une seule fois, car dans de 10:53 à 10:54, il ya une minute qui s'écroule cela veut dire que la variable $delai va se décrémenter pendant une minute, hors la décrémentation doit se faire qu'une fois pas pendant une minutes d'où la présence de la ligne 40, qui sert à faire passé les 1 minutes
J'espère que maintenant c'est plus comprehensible


try
    {  
 $req2 = $bdd->prepare('SELECT * FROM time WHERE id = ?');
 
 $req2->execute(array($_SESSION["id"]));
    
  }
    catch(Exception $e)
    {
        die('Erreur : '.$e->getMessage());
    }


   
//calcul delai  
$heure = date("g:i a"); 
  echo $heure; 
   
 while($req2->fetch() ) {
  
 $delai = $dom['duree'];  
  
 $heure = date("g:i a"); 
      echo $heure;
     
 if($delai != 0 ) {
  
 if ($heure == "11:33 am") {
  
 $delai = $delai - 1;
  
 $sql = 'UPDATE time SET duree = ?   WHERE id = ?';
$datas = array($delai, $_SESSION["id"]);
try{
  $req = $bdd->prepare($sql);
  $req->execute($datas);  
} catch ( Exception $e ) {
    // en cas d'erreur :
    echo " Erreur ! " . $e->getMessage ();
    print_r ( $datas );
    exit;
  }  
  
$i =1; 
 while($heure != "11:34 am" ) { $i++; }
  
  
 }
  } 
  
 echo $i; 
  
   } 

Messages postés
30193
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2020
2 981
Il y a de gros soucis avec ton code.
Comme déjà évoqué ... un script php ne peut fonctionner qu'un certain temps... ( en général, une vingtaine de secondes ).
Pour quelques cas rares, on peut modifier cette "limite" ... mais il est préférable d'éviter.

Ensuite, au moment où tu lances ton script ... quelle heure est-il exactement ?
Car, si ce n'est pas pile poile 10h53 ... ça ne rentrera jamais dans ton if.

A savoir également, qu'il est préférable d'utiliser les fonctions de manipulation des dates / times pour faire tes comparaisons...
(tu les trouveras dans le manuel php et des exemples en pagaille sur le net )
par exemple
if (time() >= strtotime("11:33:00")) {
  echo "ok";
}


Pour finir, je pense que tu essais de faire un truc bancale avec ton code !
Quel est le but de ce script ?
Comment est-il lancé ?
Messages postés
202
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
19 septembre 2020

Le but de mon script est d'établir un système de durée d'abonnement, c-à-d, lorsque l'abonné au compte s'enregistre pour la 1ère fois, il reçoit un délai de 30 jours, à compter de ce jour, le nombre de jour se décompte, en partant de 30 jusqu'à 0 jour, lorsque les 0 atteint l'abonné doit se réabonné sinon son compte est bloqué s'il ne renouvelle pas son abonnement

C'est le système de décompte de jours que j'essai d'établir, c'est jusque je suis pas trop fort avec la manipulation des dates/times
Messages postés
13142
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 novembre 2020
732 >
Messages postés
30193
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2020

ou bien d'enregistrer la date de fin de l'abonnement dans la base de données.
Messages postés
30193
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2020
2 981 >
Messages postés
13142
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 novembre 2020

Dans ce cas, ça ne serait pas OU mais ET
On conserve la date à laquelle l'utilisateur s'est abonné ( en cas d'éventuel litige...) ET on peut également stocker la date de fin de l'abonnement.
Messages postés
13142
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 novembre 2020
732 >
Messages postés
30193
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2020

c'était une alternative à l'utilisation d'une période fixe de 30 jours, au moment de vérifier si l'abonnement est expiré.
Messages postés
30193
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2020
2 981 >
Messages postés
13142
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 novembre 2020

Oui, j'avais bien compris.
C'est juste qu'il est préférable, dans tous les cas, de stocker AU MOINS la date d'inscription. ( au moins.. j'insiste).
Et donc, qu'on peut aussi stocker la date ( déjà calculée ) de l'échéance.
Je te reprenais juste sur le "ou" .. qu'il faudrait plutôt remplacer par "et" ....
Messages postés
202
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
19 septembre 2020
>
Messages postés
30193
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2020

J'ai opté d'enregistrer la date de debut et de fin d'abonnement, j'ai appliqué la date de fin, ça marché, voici le code :

$jour = !empty ( $_GET['date'] ) ? $_GET['date'] : NULL;    
   
try
    {  
 $req2 = $bdd->prepare('SELECT * FROM time WHERE id = ?');
 
 $req2->execute(array($_SESSION["id"]));
    
  }
    catch(Exception $e)
    {
        die('Erreur : '.$e->getMessage());
    }

 $dom =  $req2->fetch();
   
//calcul delai  

  
 $delai = $dom['duree'];
 
  $diff = abs(strtotime($delai) - strtotime($jour));
$nbJours = $diff /86400;

echo' '; echo $nbJours;


Et plus SVP comment faire pour que ce calcul s'effectue qu'une seule fois le jour? car à chaque fois que je me connecte il effectue le calcul et m'affiche un nombre incoherent

Quel condition pourrai-je mettre par exemple pour qu'il fasse le calcul une seule fois le jour?
Messages postés
202
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
19 septembre 2020

Merci pour la suggestion de travailler avec la date d'abonnement, je me suis penché sur cette suggestion et j'ai conçu quelque chose
Lorsque l'utilisateur se connecte, la date du jour est pris par
 $jour = date("Y-m-d");
, lorsqu'il arrive à la page d'accueil, ainsi s'exécute ce programme

$jour = !empty ( $_GET['date'] ) ? $_GET['date'] : NULL;    
   
try
    {  
 $req2 = $bdd->prepare('SELECT * FROM time WHERE id = ?');
 $req2->execute(array($_SESSION["id"]));   
  }
    catch(Exception $e)
    {
        die('Erreur : '.$e->getMessage());
    }

 $dom =  $req2->fetch();
   
//calcul delai  
 $delai = $dom['duree'];
 $date = $dom['date']; 
 echo $delai; 

if( $jour != $date){  
 if($delai != 0 ) {  
  $diff = abs(strtotime($jour) - strtotime($date));
$nbJours = $diff /86400; // conversion du calcul en jour (60x60x24)
  
 $delai = $delai - $nbJours;
  
 $sql = 'UPDATE time SET duree = ?   WHERE id = ?';
$datas = array($delai, $_SESSION["id"]);
try{
  $req = $bdd->prepare($sql);
  $req->execute($datas);  
} catch ( Exception $e ) {
    // en cas d'erreur :
    echo " Erreur ! " . $e->getMessage ();
    print_r ( $datas );
    exit;
  }  
 }  
  } 

echo' '; echo $nbJours; echo' '; echo $delai; // pour tester le resultat


Ce programme est conçu par le principe où lorsque quelqu'un s'abonne il lui ai attribué un code qui correspond à certains nombre de jours bien connu, à chaque jour où il se connecte le nombre des jour lié à son code diminue en partant de
  $diff = abs(strtotime($jour) - strtotime($date));
$nbJours = $diff /86400; // conversion du calcul en jour (60x60x24)
d'où la soustraction
 $delai = $delai - $nbJours;
après la BDD s'actualise

Le constat fait c'est qu'après calcul il m'affiche des nombres negative, c'est comme si la conversion en jours du calcul
 $nbJours = $diff /86400;
se passe pas bien et en plus c'est comme si il n'exécute pas la condition
if( $jour != $date){


En plus SVP comment faire pour que ce calcul s'effectue qu'une seule fois le jour? car à chaque fois que je me connecte il teste la boucle et effectue le calcul
Messages postés
13142
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 novembre 2020
732 >
Messages postés
202
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
19 septembre 2020

comme tu connais la date de fin, je ne vois plus de raison d'enregistrer, ni de mettre à jour le délai.
Messages postés
202
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
19 septembre 2020
>
Messages postés
13142
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 novembre 2020

Il ne met plus à jour ou enregistre une date quelconque le
$diff = abs(strtotime($delai) - strtotime($jour));
$nbJours = $diff /86400;  echo $nbJours;
 
est mit pour faire connaitre à l'utilisateur le nombre de jour qui lui reste de sa validité, car à une semaine du délai butoir il reçoit le message d'alert



comment faire pour que ce calcul s'effectue qu'une seule fois le jour? car à chaque fois que je me connecte il effectue le calcul et m'affiche un nombre incoherent

Quel condition pourrai-je mettre par exemple pour qu'il fasse le calcul une seule fois le jour?
Messages postés
13142
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 novembre 2020
732 >
Messages postés
202
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
19 septembre 2020

il est inutile d'enregistrer le nombre de jours valides restant dans la base de données.
il suffit d'enregistrer la date de fin de validité.
Messages postés
13142
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 novembre 2020
732 >
Messages postés
202
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
19 septembre 2020

Tu peux utiliser les variables de session pour ne faire ce travail qu'une fois par jour.
Messages postés
202
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
19 septembre 2020
>
Messages postés
13142
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 novembre 2020

J'ai appliqué la date de fin, ça marché, voici le code :

$jour = !empty ( $_GET['date'] ) ? $_GET['date'] : NULL;    
   
try
    {  
 $req2 = $bdd->prepare('SELECT * FROM time WHERE id = ?');
 
 $req2->execute(array($_SESSION["id"]));
    
  }
    catch(Exception $e)
    {
        die('Erreur : '.$e->getMessage());
    }

 $dom =  $req2->fetch();
   
//calcul delai  

  
 $delai = $dom['duree'];
 
  $diff = abs(strtotime($delai) - strtotime($jour));
$nbJours = $diff /86400;

echo' '; echo $nbJours;


Et plus SVP comment faire pour que ce calcul s'effectue qu'une seule fois le jour? car à chaque fois que je me connecte il effectue le calcul et m'affiche un nombre incoherent

Quel condition pourrai-je mettre par exemple pour qu'il fasse le calcul une seule fois le jour?
Messages postés
202
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
19 septembre 2020

exactement c'est inutile, j'enregistre pas le nombre de jours restant, en ce qui concerne ce problème je l'ai déjà résolu par ta proposition, mon programme enregistre juste la date de debut et la date de fin d'abonnement, mais je donne la possibilité à l'abonnée de connaitre le nombre des jours qui lui reste en affichant sur mon site celui-ci d'où :

  $diff = abs(strtotime($delai) - strtotime($jour));
$nbJours = $diff /86400;

echo' '; echo $nbJours;



Donc lorsque l'abonné se connecte, la date du jour est récupéré puis fait la soustraction avec la date de fin, ainsi le nombre de jours restant lui est affiché
Le problème que j'ai actuellement c'est que lorsque l'abonné se connecte pour la première fois(en un jour) mon code s'execute normalement et affiche le bon le nombre,
mais une fois deconnecté puis se reconnecte, il affiche un resultat incoherent, je ne comprend pas pourquoi il agit comme ça
Messages postés
13142
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 novembre 2020
732
difficile de comprendre ce que tu fais quand tu ne montres qu'une petite partie de ton code.
tu ne donnes pas d'information précise à propos de ce qu'il affiche.
as-tu affiché les valeurs de $delai, $jour, $nbjours et $diff? cela t'aidera à déterminer d'où vient l'erreur.
Messages postés
202
Date d'inscription
vendredi 15 novembre 2019
Statut
Membre
Dernière intervention
19 septembre 2020
>
Messages postés
13142
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 novembre 2020

Eureka!! j'ai résolu le problème, j'ai pu répéré mon erreur, c'est réglé. GRAND MERCI