Comparaison de dates : je n'arrives pas !!!

Résolu
morpheus22170 Messages postés 99 Date d'inscription vendredi 20 janvier 2006 Statut Membre Dernière intervention 8 septembre 2009 - 18 déc. 2008 à 23:13
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 - 19 déc. 2008 à 19:10
Bonsoir,

C'est un truc tout simple mais je n'arrive pas a faire un système d'alerte quand les livres ne sont pas rendu à temps

dans le cas, j'ai un livre emprunté le 18-11-2008 (2008-11-18 dans mon code) et le retour prévu le 17-12-2008 (vice-versa)

je n'arrive pas à afficher le livre qui est en retard d'un jour. Quand j'inverse le signe je vois les autres livres à rendre plus tard

$aujourdhui = date("Y-m-d");
    $today = date("d-m-Y");
   
    echo "Nous sommes aujourd'hui le " . $today . "" ;
    echo "
Vous trouverez ci-dessous la liste des livres non rendus.";
    echo "";
    $user = "root";
    $host = "localhost";
    $password = "";
    $database = "bibliotheque";
    $connexion = mysql_connect($host, $user, $password) or die ("Connexion au serveur impossible");
    $db = mysql_select_db($database, $connexion) or die ("Sélection de la base de données impossible");
    $rq = "SELECT * FROM emprunts WHERE DateFinEmp >= '$aujourdhui' ";
    $result = mysql_query($rq) or die ("Exécution de la requête impossible");
    echo " LISTE DES ALERTES EMPRUNTS ";
    echo "\";
    echo \"----
\";
    echo \"Numéro d'emprunt, \";
    echo \"Nom du livre, \";
    echo \"Nom de l'adhérent, \";
    echo \"Date d'emprunt, \";
    echo \"Date de retour de l'emprunt, \";
    echo \"\";
    echo \"----
\";
    while ($ligne = mysql_fetch_array($result))
    {
        echo \"";
        echo $ligne[0];
        echo ", \";
        echo \"";
        echo $ligne[1];
        echo ", \";
        echo \"";
        echo $ligne[2];
        echo ", \";
        echo \"";
        echo $ligne[3];
        echo ", \";
        echo \"";
        echo $ligne[4];
        echo ", \";
        echo \"\";
    }
    echo "
";

6 réponses

willeraser Messages postés 55 Date d'inscription mercredi 15 octobre 2003 Statut Membre Dernière intervention 6 mai 2009
19 déc. 2008 à 01:31
Avec un supérieur ou égal, déjà, tu englobes les livres qui doivent être rendus le jour même, donc par définition, pas en retard.
Il te faut donc un comparateur de supériorité strict si on suit ta logique.
Bon mais ensuite, s'il faut que ca se fasse 1 jour après, c'est donc la date d'aujourd'hui + 1 jour.
Or, une date est générée avec un motif que tu as défini (chaque membre est séparé par un tiret).
Renseigne toi sur les fonctions explode et implode.

Tu exploses ta chaine en choisissant le délimiteur tiret. Ca va te donner un tableau de 3 cases indexées de 0 à 2
Ensuite, ta 2ème case (indexée 1), sera celle qui contient le jour (format US). Tu rajoute +1 à la valeur que contient cette case. Ca t edonne donc aujourd'hui+1 c'est à dire demain. Donc 1 jour de retard par rapport à la date maximale d'emprunt qui serait en théorie aujourd'hui.
Ensuite, tu fais un implode (réunion d'un tableau en une variable unique).

______
En faisant ca, ca te permet donc d'ajouter 1 jour à une date, quelle qu'elle soit.
Toi si ce que tu veux c'est récupérer tous les livres en retard d'un jour, c'est donc une comparaison d'égalité.
$req mysql_query('SELECT * FROM emprunts WHERE DateFinEmp \''.$aujourdhui+1.'\'');

Voilà, il est tard, mon cerveau commence à partir en vrille, peut être que j'ai mal lu ton problème xD
On verra !

PS : pitié, réduis le nombre de echo ! Ca rend le code moins lourd et plus lisible. Et utilise les simples quotes pour les echo (le seul interet des doubles quotes étant l'interprétation des variables dans la chaine, mais toi tu concatène donc ca devient inutile, "lent" et pas beau)
Aussi, à moins que ton site exploite plusieurs bases de données sur plusieurs serveurs, le tout dans un même script, inutile d'affecter dans une var le résultat de mysql_connect et inutile d'ajouter cette var en paramètre dans mysql_select_db ^^ c'est de l'optimisation mais c'est toujours plus agréable d'avoir un code court, simple et efficace !
3
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
19 déc. 2008 à 12:08
Salut,

Tu rajoute +1 à la valeur que contient cette case. Ca t edonne donc aujourd'hui+1 c'est à dire demain.
=>  non, ça donnera régulièrement n'importe quoi
ex : nous sommes le 31/12/2008 => 32/12/2008 ???? alors qu'il faut avoir 01/01/2009

=> voir mktime

Cordialement,

Kohntark -
3
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
19 déc. 2008 à 12:48
Hello,

perso, je préfère strtotime(), plus simple à utiliser et plus lisible :
$demain = strftime('%Y-%m-%d', strtotime('+ 1 day'));
3
willeraser Messages postés 55 Date d'inscription mercredi 15 octobre 2003 Statut Membre Dernière intervention 6 mai 2009
19 déc. 2008 à 13:28
non, ça donnera régulièrement n'importe quoi
ex : nous sommes le 31/12/2008 => 32/12/2008 ???? alors qu'il faut avoir 01/01/2009

putain c'est exact >.< on dira que c'est du à l'heure du post okay ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
morpheus22170 Messages postés 99 Date d'inscription vendredi 20 janvier 2006 Statut Membre Dernière intervention 8 septembre 2009
19 déc. 2008 à 19:00
Salut à tous (willeraser, kohntark et malalam)

merci pour votre aide à tous tout d'abord,

c'est vrai que ca peut paraitre .... à voir un réveillon le 32 décembre 2008 !!!

Tourner général à nouveau de champagne !!!!

En fait, willeraser m'a mis la puce à l'oreille avec explode et implode. donc j'ai modifié tout le code et j'ai pu travaillé avec des fonctions de dates que j'utilisais déjà. Voilà, le code marche nickel et même avec prévisions sur l'année 2009

code:
$aujourdhuiA = date("Y");
 $aujourdhuiB = date("m");
 $aujourdhuiC = date("d");
 $today = date("d-m-Y");
  
 echo "Nous sommes aujourd'hui le " . $today . "" ;
 echo "
Vous trouverez ci-dessous la liste des livres non rendus.";
 echo "";
 $user = "root";
 $host = "localhost";
 $password = "";
 $database = "bibliotheque";
 $connexion = mysql_connect($host, $user, $password) or die ("Connexion au serveur impossible");
 $db = mysql_select_db($database, $connexion) or die ("Sélection de la base de données impossible");
 $rq = "SELECT * FROM emprunts";
 $result = mysql_query($rq) or die ("Exécution de la requête impossible");
 echo " LISTE DES ALERTES EMPRUNTS ";
 echo "\";
 echo \"----
\";
 echo \"Numéro d'emprunt, \";
 echo \"Nom du livre, \";
 echo \"Nom de l'adhérent, \";
 echo \"Date d'emprunt, \";
 echo \"Date de retour de l'emprunt, \";
 echo \"\";
 echo \"----
\";
 while ($ligne = mysql_fetch_array($result))
 {
  $jour = date(\"d\", strtotime($ligne[4])); //correspond à la colonne DateFinEmp
  $mois = date(\"m\", strtotime($ligne[4]));
  $annee = date(\"Y\", strtotime($ligne[4]));
  
  if ($annee <= $aujourdhuiA)
  {
   if ($mois <= $aujourdhuiB)
   {
    if ($jour <= $aujourdhuiC)
    {
     echo \"";
     echo $ligne[0];
     echo ", \";
     echo \"";
     echo $ligne[1];
     echo ", \";
     echo \"";
     echo $ligne[2];
     echo ", \";
     echo \"";
     echo $ligne[3];
     echo ", \";
     echo \"";
     echo $ligne[4];
     echo ", \";
     echo \"\";
    }
    else
    {
    }
   }
   else
   {
   }
  }
  else
  {
  }
 }
 echo "
";

Merci à tous pour vos remarques. Bonne fête de fin d'année.
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
19 déc. 2008 à 19:10
Beuh...j'ai du mal, là. Tu te compliques la vie.
Si le but est finalement de ne sortir que les livres en retard :

$sQuery = 'SELECT blabla FROM emprunts WHERE DateFinEmp < \''.date('Ymd').'\'';

ça suffit amplement, si ton champ DateFinEmp  est un datetime ou timestamp.
Sinon, suffit de le convertir dans la requête.
0
Rejoignez-nous