IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

condition de temps pour modifier une valeur


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 43
    Points : 17
    Points
    17
    Par défaut condition de temps pour modifier une valeur
    Bonjour à tous,

    je suis en moment en train de réaliser un code que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $queryStatus = "SELECT field_2, field_6  FROM ibf_pfields_content";
    	$resultStatus = mysql_query($queryStatus, $db) or die($queryStatus . " - " . mysql_error());	
    
    while ($status = mysql_fetch_array($resultStatus))
    {
    	if ("field_2 n'a pas changé de valeur depuis deux mois") {
    	$status["field_6"] = "Abonné";
    	} else if ("field_2 n'a pas changé de valeur depuis quatre mois") {
    	$status["field_6"] = "Inactif";
    	
    	$statusField6 = $status["field_6"];
    	$sql = "UPDATE ibf_pfields_content SET field_6 = '$statusField6' ";
    }
    les donées :
    - field_2 est de cette forme : 76H30 (correspond à un total d'heure)
    - field_6 par défaut est de valeur "Actif".

    Les conditions :
    - Si field_2 n'a pas changé de valeur depuis 2 mois, alors field_6 change de valeur
    - Si field_2 n'a pas changé de valeur depuis 4 mois, alors field_6 change de valeur.

    Dans l'idée, field_6 passe d'abord par la première instruction, une fois sa valeur changée au bout de deux mois (Abonné), le compte à rebours reprend jusqu'à 4 mois où sa valeur changera de nouveau (Inactif). Si field_2 change de valeur n'importe quand dans le temps, field_6 reprendra sa valeur par défaut (Actif).

    Ce sont les conditions (en gras dans la quote) qui me pose problème, je n'arrive pas à trouver la bonne formule.

    auriez vous une idée ?

    Cordialement.

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Donc field2 est un total d'heures ?

    donc 2 mois = 60 jours x 24h00 = 1440h00
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (field_2 < 1440h00)

    4 mois = 120 jours * 24h00
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (field_2 < 2880h00)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 43
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par MaitrePylos Voir le message
    Donc field2 est un total d'heures ?

    donc 2 mois = 60 jours x 24h00 = 1440h00
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (field_2 < 1440h00)

    4 mois = 120 jours * 24h00
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (field_2 < 2880h00)
    Perdu

    J'ai dû mal préciser le contexte :

    Par exemple, lorsqu'un membre participe à une activité pendant 01H30, cette durée est comptabilisée dans son "carnet d'heures". Field_2 est là pour ça, stocker le total d'heures de participation pour chaque membre (actif). Maintenant si ce membre n'a participé à aucune activité pendant 2 mois (Field_2 n'a pas changé de valeur), alors le statut de ce membre change (abonné). Si au bout de 4 mois, il n'a toujours pas participé, son statut change à nouveau (Inactif). Si maintenant il a de nouveau participé (le field_2 le concernant à changer de valeur), son statut revient en "Actif" et le compte à rebours de 2 mois (puis 4 mois) est réinitialisé.

  4. #4
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Pour alors c'est pas sur son temps sur ton site qu'il faut jouer, mais bien sur sa présence.


    exemple, je me connecte, dans ta base tu mets la date d'aujourd'hui, si je me connecte demain tu updates la date.


    ensuite tu vérifie si je ne suis pas venu depuis moins de 2 mois

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 43
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par MaitrePylos Voir le message
    Pour alors c'est pas sur son temps sur ton site qu'il faut jouer, mais bien sur sa présence.


    exemple, je me connecte, dans ta base tu mets la date d'aujourd'hui, si je me connecte demain tu updates la date.


    ensuite tu vérifie si je ne suis pas venu depuis moins de 2 mois
    participation à une activité... la présence sur un site (connexion/déconnexion) n'a rien à voir puisque le membre peut très bien surfer sur le site sans participer à une activité.

    En gros, des membres réalisent 01H30 de vol sur avions. L'organisateur, grâce à un formulaire, update les heures de vol des participants (+01H30 pour eux). Si les heures de vol d'un membre n'a pas été updaté depuis deux mois, son statut passe en abonné, etc...

  6. #6
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Cela reste le même principe.

    le faite qu'il passe 10min ou 4h00 sur une activité, ne t'intéresse que moyennement, ce qui t'intéresse c'est le fait de faire une activité tout les 2 mois au minimum.

    donc chaque fois que je fais une activité tu mets un datetime dans le db et c'est cet infos que tu compares et non pas le temps passé a faire une activté.

    est-ce clair?

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 43
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par MaitrePylos Voir le message
    Cela reste le même principe.

    le faite qu'il passe 10min ou 4h00 sur une activité, ne t'intéresse que moyennement, ce qui t'intéresse c'est le fait de faire une activité tout les 2 mois au minimum.

    donc chaque fois que je fais une activité tu mets un datetime dans le db et c'est cet infos que tu compares et non pas le temps passé a faire une activté.

    est-ce clair?
    Oui effectivement
    Ce que je ne comprend pas, c'est comment intégrer le facteur temps (2 mois, 4 mois) et un moyen de comparaison

    EDIT : Ok j'ai compris. Je créé un attribut "DateUpdate" dans ma table. A chaque fois que je mets à jour les heures des participants, la date du jour est inséré dans le champ "DateUpdate", ensuite je fais un comparatif entre la date de ce champ et la date du jour

    J'ai bon ?

  8. #8
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Ben voila,


    tiens un petit scripts dont tu peux t'inspirer pour comparer 2 dates moins 2 mois

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function diff_date($day , $month , $year , $day2 , $month2 , $year2){
      /* fonction de calcul de différence de date */
      $timestamp = mktime(0, 0, 0, $month, $day, $year);
      $timestamp2 = mktime(0, 0, 0, $month2, $day2, $year2);
      $diff_date = floor(($timestamp - $timestamp2) / (3600 * 24));
      return $diff_date;
    }
     
    echo diff_date(date('d'),date('m'),date('y'),date('d'),date('m')-2,date('y')).'<br>';

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 43
    Points : 17
    Points
    17
    Par défaut
    Ok je me suis servis de ta fonction mais j'ai une petite erreur :

    le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    function diff_date($day , $month , $year , $day2 , $month2 , $year2){
      /* fonction de calcul de différence de date */
      $timestamp = mktime(0, 0, 0, $month, $day, $year);
      $timestamp2 = mktime(0, 0, 0, $month2, $day2, $year2);
      $diff_date = floor(($timestamp - $timestamp2) / (3600 * 24));
      return $diff_date;
    }
     
    $queryStatus = "SELECT DateUp, field_6  FROM ibf_pfields_content";
    	$resultStatus = mysql_query($queryStatus, $db) or die($queryStatus . " - " . mysql_error());	
     
    while ($status = mysql_fetch_array($resultStatus))
    {
     
    	list ($date, $heure) = split(' +', $status['DateUp']);
    	   list ($anneeUp, $moisUp, $jourUp) = split('-', $date);
     
    		  $deuxmois = ">= 60" ;
    		  $quatremois = ">= 120";
     
              switch (diff_date (date('d'),date('m'),date('y'),$jourUp,$moisUp,$anneeUp))
    		  {
    		  case $deuxmois :
    			$status["field_6"] = "Abonné";
    			break;
    		  case $quatremois :
    			$status["field_6"] = "Inactif";
    			break;
    		  }
     
    	$statusField6 = $status["field_6"];
    	$sql = "UPDATE ibf_pfields_content SET field_6 = '$statusField6' ";
    code erreur
    Warning: mktime() expects parameter 6 to be long, string given in /var/www/virtual/htdocs/roster/esc.php on line 13

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 43
    Points : 17
    Points
    17
    Par défaut
    Petit up. j'ai bossé le code depuis la semaine dernière mais il existe une erreur que je n'arrive pas à voir.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    function diff_date($day , $month , $year , $day2 , $month2 , $year2){
    	/* fonction de calcul de différence de date */
    	$timestamp = mktime(0, 0, 0, $month, $day, $year);
    	$timestamp2 = mktime(0, 0, 0, $month2, $day2, $year2);
    	$diff_date = floor(($timestamp - $timestamp2) / (3600 * 24)); // Différence en jour entre le 2 dates
    	return $diff_date;
    }
     
     
     
    $queryStatus = "SELECT DateUp, field_6  FROM ibf_pfields_content";
    	$resultStatus = mysql_query($queryStatus, $db) or die($queryStatus . " - " . mysql_error());	
     
    while ($status = mysql_fetch_array($resultStatus))
    {
     
    	list ($dateUpdate, $heure) = split(' +', $status['DateUp']);
    	   list ($anneeUp, $moisUp, $jourUp) = split('-', $dateUpdate);
     
     
                $le_jour = date("d");
                $le_mois = date("m");
                $l_annee = date("Y");
     
    			$difference = diff_date ($le_jour , $le_mois , $l_annee , $jourUp , $moisUp , $anneeUp);
     
    			switch (TRUE) {
                  case ($difference >=60 AND $difference < 120) :
    			       $status["field_6"] = 'Abonné';
    			  break;
    		      case ($difference >= 120) :
    			       $status["field_6"] = 'Inactif';
    			  break;
    			  default:
    			       $status["field_6"] = 'Actif';
    			}
     
    	$upField6 = "UPDATE ibf_pfields_content SET field_6 ='".$status['field_6']."'";
        $resField6 = mysql_query($upField6) or die(mysql_error());	
    }
    Résultat : "Inactif" dans tous les champs alors que j'ai des valeurs inférieures à 60 dans la variable $difference

  11. #11
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Et simplement avec des if

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    while ($status = mysql_fetch_array($resultStatus))
    {
     
    	list ($dateUpdate, $heure) = split(' +', $status['DateUp']);
    	   list ($anneeUp, $moisUp, $jourUp) = split('-', $dateUpdate);
     
     
                $le_jour = date("d");
                $le_mois = date("m");
                $l_annee = date("Y");
     
    			$difference = diff_date ($le_jour , $le_mois , $l_annee , $jourUp , $moisUp , $anneeUp);
     
    			if ($difference >=60 AND $difference < 120)
    			{
    				$status["field_6"] = "Abonné";
    			}elseif ($difference >=120){
    				$status["field_6"] = 'Inactif';
    			}else{
    				$status["field_6"] = 'Inactif';
    			}
     
    	$upField6 = "UPDATE ibf_pfields_content SET field_6 ='".$status['field_6']."'";
        $resField6 = mysql_query($upField6) or die(mysql_error());	
    }

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 43
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par MaitrePylos Voir le message
    Et simplement avec des if

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    while ($status = mysql_fetch_array($resultStatus))
    {
     
    	list ($dateUpdate, $heure) = split(' +', $status['DateUp']);
    	   list ($anneeUp, $moisUp, $jourUp) = split('-', $dateUpdate);
     
     
                $le_jour = date("d");
                $le_mois = date("m");
                $l_annee = date("Y");
     
    			$difference = diff_date ($le_jour , $le_mois , $l_annee , $jourUp , $moisUp , $anneeUp);
     
    			if ($difference >=60 AND $difference < 120)
    			{
    				$status["field_6"] = "Abonné";
    			}elseif ($difference >=120){
    				$status["field_6"] = "Inactif";
    			}else{
    				$status["field_6"] = "Actif";
    			}
     
    	$upField6 = "UPDATE ibf_pfields_content SET field_6 ='".$status['field_6']."'";
        $resField6 = mysql_query($upField6) or die(mysql_error());	
    }
    Même résultat je pige pas pourquoi ça fonctionne pas.

  13. #13
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Fais une fois un echo de $status['DateUp']

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 43
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par MaitrePylos Voir le message
    Fais une fois un echo de $status['DateUp']
    echo '<b>'.$status['DateUp'].'</b><br>';
    résultat :
    2008-01-22 12:49:35
    2008-05-28 09:38:24
    0000-00-00 00:00:00
    2008-05-22 23:07:50
    0000-00-00 00:00:00

  15. #15
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Ton premier split n'est pas bon, tu dois le faire sur un espace

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 43
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par MaitrePylos Voir le message
    Ton premier split n'est pas bon, tu dois le faire sur un espace
    testé mais toujours le même résultat.

    J'ai fait un echo de la variable $difference et j'ai ce résultat :
    2008-01-22 12:49:35 126 (jours)
    2008-05-28 09:38:24 0 (jours)
    0000-00-00 00:00:00 3031 (jours)
    2008-05-22 23:07:50 6 (jours)
    0000-00-00 00:00:00 3031 (jours)

    Il calcule bien le nombre de jours qu'il y a entre la date d'aujourd'hui et la date de la dernière MAJ de la table mais rien ni fait... là où il y a "0" ou "6" il y a "Inactif" alors que < 120 et < 60

  17. #17
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Et si on le faisait directement dans la db

    teste le code suivant, tout ce fait dans Mysql :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    $queryStatus = "SELECT DATEDIFF(CURRENT_DATE(),DateUp) as returndate,field_6  FROM ibf_pfields_content";
    $resultStatus = mysql_query($queryStatus, $db) or die($queryStatus . " - " . mysql_error());	
     
    while ($status = mysql_fetch_array($resultStatus))
    {
     
    			$difference = $status['returndate'];			
     
    			if ($difference >=60 AND $difference < 120)
    			{
    				$status["field_6"] = "Abonné";
    			}elseif ($difference >=120){
    				$status["field_6"] = 'Inactif';
    			}else{
    				$status["field_6"] = 'Inactif';
    			}
     
    	$upField6 = "UPDATE ibf_pfields_content SET field_6 ='".$status['field_6']."'";
        $resField6 = mysql_query($upField6) or die(mysql_error());	
    }
    Attention il est fort possible de devoir mettre les conditions entre quote
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ($difference >="60" AND $difference < "120")
    As toi de faire les essais.

Discussions similaires

  1. recordset pour modifier une valeur d'un champ
    Par YannC dans le forum VBA Access
    Réponses: 20
    Dernier message: 04/07/2012, 10h41
  2. Réponses: 6
    Dernier message: 31/01/2012, 18h38
  3. trigger pour modifier une valeur après création du record
    Par awalter1 dans le forum Administration
    Réponses: 5
    Dernier message: 07/03/2011, 18h41
  4. [XL-2007] Condition Si pour récupérer une valeur de cellule
    Par Scatmax dans le forum Excel
    Réponses: 11
    Dernier message: 03/05/2010, 10h43
  5. Réponses: 1
    Dernier message: 31/10/2006, 11h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo