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

[Résolu]
Signaler
Messages postés
99
Date d'inscription
vendredi 20 janvier 2006
Statut
Membre
Dernière intervention
8 septembre 2009
-
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
-
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

Messages postés
55
Date d'inscription
mercredi 15 octobre 2003
Statut
Membre
Dernière intervention
6 mai 2009

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 !
Messages postés
3706
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
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 -
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
24
Hello,

perso, je préfère strtotime(), plus simple à utiliser et plus lisible :
$demain = strftime('%Y-%m-%d', strtotime('+ 1 day'));
Messages postés
55
Date d'inscription
mercredi 15 octobre 2003
Statut
Membre
Dernière intervention
6 mai 2009

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 ?
Messages postés
99
Date d'inscription
vendredi 20 janvier 2006
Statut
Membre
Dernière intervention
8 septembre 2009

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.
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
24
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.