• imprimer
  • aide

Forum de discussions « PHP - SQL »

Retrouvez les publications relatives à ces discussions dans nos rubriques PHP, SQL.

Requête pour afficher des dates anniversaire

liste des forums liste des discussions Participer à la discussion

Photo de elizabeth Message publié le mardi 17 janvier 2012 - 12h43 par elizabeth. les pieds sur terre et la tête dans les étoiles
Bonjour,

j'ai un souci pour créer une requête... merci d'avance à ceux qui pourront m'aider,

mon client crée sa fiche, dans laquelle il indique sa date anniversaire.
je voudrais, dans le site, afficher l'agenda des 5 prochains membres dont c'est l'anniversaire.

mon souci :
si je compare mois+jour actuel avec (<) mois+jour de la date anniversaire, ça donnerait par exemple 0105 (5 janvier) < anniv 0204(4 févr) et ça fonctionne.
mais j'ai un souci au mois de décembre.
par exemple, le 20 décembre : mois+ jour actuel = 1220 si le membre est né le 5 janvier, sa date sera 0105 et le chiffre sera inférieur à la date du jour, donc lorsqu'il reste moins de 5 personnes nées entre la date du jour et la fin de l'année, ça n'affichera pas les suivants.

auriez-vous une idée ?

d'avance merci,

Elizabeth
Photo de jules Message publié le mardi 17 janvier 2012 - 14h11 par jules. modérateur
Bonjour Elizabeth,

Je pense qu'il faut nécessairement jouer avec l'année pour résoudre ton problème.
L'idéal serait de trouver la date exacte (année comprise) du prochain anniversaire de tes membres.

En admettant que la date de naissance des membres soit enregistrée dans un champ nommé "date_naissance" de type "date" dans la table "membres", tu peux obtenir la date du prochain anniversaire avec une requête du genre :

SELECT *, CONCAT(IF(RIGHT(date_naissance, 5) > RIGHT(CURRENT_DATE(),5), YEAR(CURRENT_DATE()), YEAR(CURRENT_DATE())+1), LPAD(MONTH(date_naissance),2,'0'), LPAD(DAY(date_naissance),2,'0')) as prochain_anniversaire FROM membres ORDER BY prochain_anniversaire LIMIT 0,5

La partie de la requête :
IF(RIGHT(date_naissance, 5) > RIGHT(CURRENT_DATE(),5), YEAR(CURRENT_DATE()), YEAR(CURRENT_DATE())+1)répond à ton problème en comparant le mois et le jour de la date de naissance au mois et au jour actuel et va renvoyer l'année en cours si l'anniversaire n'est pas passé ou l'année prochaine si l'anniversaire a déjà été fêté.

En reprenant ton exemple mais avec la date d'aujourd'hui (2012-01-17), le code renverra l'année 2012 pour le membre né le 4 février (son anniversaire approche) et 2013 pour le membre né le 05 janvier (son anniversaire est passé, le prochain sera en 2013).

Les fonctions "CONCAT" et "LPAD" permettent d'obtenir des dates de prochains anniversaires au format ISO : YYYY-MM-DD afin de pouvoir les trier par le "ORDER BY".

Bon courage.
Photo de elizabeth Message publié le mardi 17 janvier 2012 - 16h20 par elizabeth. les pieds sur terre et la tête dans les étoiles
Bonjour Jules,

et merci de ton aide,

le champs date_naissance se nomme chez moi "anniv_classe"
ma table : "membres"
ma requête : "anniversaire"

voici ma requête :
mysql_select_db($database_client, $client); $query_anniversaire = "SELECT *, CONCAT(IF(RIGHT(anniv_classe, 5) > RIGHT(CURRENT_DATE(),5), YEAR(CURRENT_DATE()), YEAR(CURRENT_DATE())+1), LPAD(MONTH(anniv_classe),2,'0'), LPAD(DAY(anniv_classe),2,'0')) as prochain_anniversaire FROM membres ORDER BY prochain_anniversaire LIMIT 0,5"; $anniversaire = mysql_query($query_limit_anniversaire, $client) or die(mysql_error()); $row_anniversaire = mysql_fetch_assoc($anniversaire);

ensuite, dans ma page, j'ai mis :
<?php if(RIGHT(anniv_classe, 5) > RIGHT(CURRENT_DATE(),5), YEAR(CURRENT_DATE()), YEAR(CURRENT_DATE())+1) { echo $row_anniversaire['nom']; ?> - <?php echo $row_anniversaire['anniv_classe']; } ?>

j'ai le message d'erreur suivant :
Parse error: parse error in f:\program files\easyphp1-8\www\xxx\test-anniv.php on line 54
la ligne renvoie au code dans la page "if(RIGHT etc...)"
j'ai vérifié la syntaxe, les ouvertures/fermetures de parenthèses, je ne vois pas d'où ça peut venir.
est-ce que RIGHT pourrait poser un problème avec ma version de php ? ou y a t'il une coquille échappée quelque part ?
mon adaptation est-elle incorrecte ?

merci encore,

Elizabeth
Photo de jules Message publié le mardi 17 janvier 2012 - 16h33 par jules. modérateur
Le code que j'ai donné est du code SQL et non du PHP.
C'est la requête qui fait la sélection des données que tu recherches, il n'y a pas de raison de faire un test conditionnel (IF) avec le PHP.
Ton code ne fonctionne donc pas car les fonctions RIGHT, LPAD et la syntaxe du IF ne sont pas du PHP mais du SQL (MySQL).

Essaye ce code :

mysql_select_db($database_client, $client); $query_anniversaire = "SELECT *, CONCAT(IF(RIGHT(anniv_classe, 5) > RIGHT(CURRENT_DATE(),5), YEAR(CURRENT_DATE()), YEAR(CURRENT_DATE())+1), LPAD(MONTH(anniv_classe),2,'0'), LPAD(DAY(anniv_classe),2,'0')) as prochain_anniversaire FROM membres ORDER BY prochain_anniversaire LIMIT 0,5"; $anniversaire = mysql_query($query_limit_anniversaire, $client) or die(mysql_error()); while ($row_anniversaire = mysql_fetch_assoc($anniversaire)) { echo $row_anniversaire['nom'] . ' ' . $row_anniversaire['anniv_classe'] . '<br />'; }
Photo de elizabeth Message publié le mardi 17 janvier 2012 - 17h40 par elizabeth. les pieds sur terre et la tête dans les étoiles
ça marche !

merci encore de ton aide, Jules,

Elizabeth

liste des forums liste des discussions Participer à la discussion

Vous devez obligatoirement vous identifier en tant que membre pour participer à cette discussion.

ACCÉS COMMUNAUTÉ

Rejoignez ALL HTML

Publiez vos articles, actualités, communiqués ... Donnez votre avis, partagez votre réseau, rencontrez d'autres membres et participez à la vie de la communauté.

Les 5 dernières discussions