Liste des anniversaires pour les n prochains jours, dans l'ordre d'arrivees (php+mysql)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 11 183 fois - Téléchargée 31 fois

Contenu du snippet

Un bon exemple vaut mieux qu'un long discours (ici N=50 et nous sommes le 8/11/85) :
Le script affichera :

Emmanuelle aura 23 ans dans 10 jours (le 18 Nov.)
Fanny aura 16 ans dans 13 jours (le 21 Nov.)
Harold aura 14 ans dans 21 jours (le 29 Nov.)
Elisa aura 22 ans dans 29 jours (le 7 Dec.)
Arnaud aura 8 ans dans 32 jours (le 10 Dec.)
Agnès aura 48 ans dans 34 jours (le 12 Dec.)
Romain aura 21 ans dans 46 jours (le 5 Jan.)
Jean-Marc aura 43 ans dans 47 jours (le 6 Jan.)

La table doit contenir un/des champ nom/prénom et un champ date de naissance

Source / Exemple :


/* Script by mOut - http://mout.fr/

$CONFIG['hostname'] = "localhost";  //mettez les paramètres de votre base
$CONFIG['database'] = "nomdemabase";  //la meme chose que username pour free
$CONFIG['username'] = "monlogin";
$CONFIG['password'] = "monpassword";
$CONFIG['table'] = "matable";
$n = 50; //nombre de jours de prévision

$sql = mysql_connect($CONFIG['hostname'], $CONFIG['username'], $CONFIG['password']) or die(mysql_error());
mysql_select_db($CONFIG['database'], $sql);
$result = mysql_query("SELECT
   prenom, 
   nom, 
   DATE_FORMAT(date, '%e %b.') AS datef, 
   (YEAR(CURRENT_DATE)-YEAR(date)) - (RIGHT(CURRENT_DATE,5)<=RIGHT(date,5)) +1 AS age, 
   TO_DAYS(CONCAT(LEFT(CURRENT_DATE,5), RIGHT(date, 5))) - TO_DAYS(CURRENT_DATE) AS diff, 
   DATE_FORMAT(CONCAT('31-12-',YEAR(CURRENT_DATE)), '%j') AS nbj

FROM ".$CONFIG['table']) or die(mysql_error());

$i=0;
while($row = mysql_fetch_array($result)){
	if($row['diff']<0) $row['diff'] = $row['diff'] + $row['nbj'];
	if($row['diff']<$n){
		$tab[$i][0] = $row['diff'];
		$tab[$i]['nom'] = $row['prenom'];
		$tab[$i]['age'] = $row['age'];
		$tab[$i]['dans'] = $row['diff'];
		$tab[$i]['date'] = $row['datef'];
	}
	$i++;
}
//tri sur $tab[][0] :
sort($tab); 

//tout est proprement rangé dans $tab maintenant

//formatage à votre guise (ex: si 0 jours mettre en rouge :))) :
foreach($tab as $ligne) echo "<b>".$ligne['nom']."</b> aura ".$ligne['age']." ans dans ".$ligne['dans']." jours (le <b>".$ligne['date']."</b>)<br />";

Conclusion :


- Ici je considère qu'il y a un champ "prenom", un champ "nom" et un champ "date" de type DATE, mais vous pouvez adapter le code a votre guise...

- 'nbj' renvoie 365 ou 366 selon l'année

- vous pouvez changer le format dans DATE_FORMAT() (cf. www.mysql.com)

A voir également

Ajouter un commentaire

Commentaires

ehmarc
Messages postés
393
Date d'inscription
mardi 2 décembre 2003
Statut
Membre
Dernière intervention
29 septembre 2008
-
salut

bonne utilisation des dates sous mysql

seul petit reproche dans ta requete ca serait pas plus simple et plus rapide de mettre une clause where ca eviterait de faire du traitement pour certain anniversaire dans le cas d'une grosse base (ca evite de tout parcourir) ce qui optimiserait le code ca evite
if($row['diff']<$n){} cette condition

mais pour moi un code comme ca c plus intermediaire que initié

++
antoine129
Messages postés
64
Date d'inscription
vendredi 28 mai 2004
Statut
Membre
Dernière intervention
5 juin 2006
-
oui mais mon problème était pour trier par délai, car au départ j'avais fait un where mais le tri était impossible dans ce cas précis (ou trop compliqué pour moi :P)
Donc j'ai décomposé en un tableau :)
Mais c'est vrai que ça manque d'optimisation
Et pour le niveau tu as raison je vais changer ça.
ehmarc
Messages postés
393
Date d'inscription
mardi 2 décembre 2003
Statut
Membre
Dernière intervention
29 septembre 2008
-
C surement pas le niveau expert que je voulai dire plutot debutant+ (donc initié)

ton code ne présente qu'un simple affichage de donnée et une belle requete (il est vrai tas deja du plancher dessus un peu) avec une utilisatin des fonctions dates de mysql qui pourrait etre optimisée mais bon...

En fait sur le premier message je pensait que initié c'étè le niveau expert (c donc moi qui ai fait une erreur)
désolé...
cs_gleyne
Messages postés
6
Date d'inscription
mercredi 23 juillet 2003
Statut
Membre
Dernière intervention
26 décembre 2004
-
Bonjour,
j'ai testé ce programme et j'ai des résultats étonnants
voici le début de ma liste
matahali aura 23 ans dans -5 jours (le 2 Jan.)
eloise aura 29 ans dans -3 jours (le 4 Jan.)
sheeryas aura 24 ans dans -3 jours (le 4 Jan.)
doriane aura 20 ans dans -2 jours (le 5 Jan.)
lili aura 20 ans dans -1 jours (le 6 Jan.)
caroline aura 22 ans dans 0 jours (le 7 Jan.)
irielle aura 20 ans dans 0 jours (le 26 Dec.)
pamela aura 28 ans dans 0 jours (le 26 Dec.)
eva aura 20 ans dans 1 jours (le 27 Dec.)
monia aura 34 ans dans 1 jours (le 27 Dec.)
pauline aura 17 ans dans 1 jours (le 8 Jan.)
ghania aura 25 ans dans 2 jours (le 28 Dec.)
clara aura 18 ans dans 3 jours (le 10 Jan.)
flora aura 18 ans dans 3 jours (le 29 Dec.)
geraldine aura 24 ans dans 3 jours (le 10 Jan.)
henda aura 21 ans dans 4 jours (le 30 Dec.)
nadia aura 30 ans dans 4 jours (le 11 Jan.)
solange aura 19 ans dans 4 jours (le 30 Dec.)
alia aura 20 ans dans 5 jours (le 31 Dec.)
christine aura 22 ans dans 5 jours (le 12 Jan.)
kalliopi aura 30 ans dans 5 jours (le 12 Jan.)

y a t'il une modif à faire
merci
cordialement
gleyne@free.fr
cs_gleyne
Messages postés
6
Date d'inscription
mercredi 23 juillet 2003
Statut
Membre
Dernière intervention
26 décembre 2004
-
dans votre exemple, il n'y a pas 47 jours entre le 8/11/85 et le 6/01/86

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.