Calcul d'un age en fonction d'une année [Résolu]

Michel2107 89 Messages postés jeudi 28 juin 2007Date d'inscription 15 juin 2018 Dernière intervention - 8 juin 2018 à 08:25 - Dernière réponse : Michel2107 89 Messages postés jeudi 28 juin 2007Date d'inscription 15 juin 2018 Dernière intervention
- 15 juin 2018 à 05:24
Bonjour,

Je bute sur un problème (probablement tout simple et tout bon mais bon voila je suis une quiche en PHP).
J'aimerai calculer un age en fonction de l'année de naissance et l'intégrer dans un code que j'ai pris sur le net qui défini les anniversaires du mois en cours (c'est a dire qu'une table mysql est faite avec un champ "jour" et un champ "mois" et en fonction de ces données, j'ai une requête qui dit que telles personnes de ma base auront leurs anniversaires ce mois ci - en fait c'était un script que j'avais pris sur le net et que j'avais déjà modifié a ma façon avec des switch case ... le problème c'est que je n'arrive plus a retrouver le script original sur le net)

Bref j'ai créé un champ "annee" dans la table mysql
Au début du code php après le script de connexion à la base , j'ai défini l'année en cours par un

$annee_en_cours = date("Y");


Après la requête j'ai mis un

 if($nombre_lignes > 0 ){

while($data = mysqli_fetch_assoc($req)) {
{
$annee= $data['annee'];
}
}


et pour calcul le résultat j'ai mis un if / else

if($mois_en_cours<mois_de_naissance)
{
$age = $annee_en_cours - $annee_de_naissance - 1 ; //car anniversaire pas encore passé
}
else
{
$age = $annee_en_cours - $annee_de_naissance ; // car anniversaire atteint
}


Enfin pour afficher ce résultat j'ai mis le $age dans un echo (qui est composé d'un switch case du jour du naissance pour définir si le jour de naissance est ler1er du mois - pour ajouter le "er" au 1, si le jour est égal au jour d'anniversaire de la personne - dans ce cas je lui souhaite un joyeux anniversaire avec l'affichage d'un petit cadeau à coté et dans les autres cas le jour n'est pas encore atteint donc l'affichage est "le [numero du jour] ce sera l'anniversaire de telle personne, il a xx ans - donc le resultat'est année en cours - année de naissance - 1) et mon problème c'est qu'a l'affichage du résultat il affiche 2018 ou 2017 (il ne reconnait pas l'année de naissance de la personne, il ne reconnait que l'année en cours auquel il retranche 1 si le jour de naissance de la personne n'a pas encore été atteint mais s'il affiche 2017 ou 2018 c'est bien qu'il reconnait la variable age et la formule de calcul puisqu'il retranche 1 si le jour de naissance n'est pas atteint).

J'ai essayé en appelant le champ année de ma BDD dans ma requête - le $requete=select(" ....") et la les noms des personnes qui sont nées le mois en cours disparaissent complètement (php saute directement dans cas ou il n y ait pas d'anniversaire pour le mois en cours)


Si quelqu'un peut me dire pourquoi l'année de naissance n'est pas reconnue dans le résultat ce serait cool (et sans cette portion de code que j'ai ajoutée le code fonctionne parfaitement)

Merci
Michel
--
Afficher la suite 

Votre réponse

16 réponses

jordane45 22146 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 21 août 2018 Dernière intervention - 8 juin 2018 à 08:52
0
Merci
Bonjour,
Tu parles d'un champ "annee" dans ta bdd .... et ensuite dans ton code tu parles aussi du mois_de_naissance....
Ce champ existe dans ta bdd ??

Il serait bien de nous indiquer :
- La structure exacte de ta table ( nom des champs, type et exemple de contenu )
- Le code complet et non des lignes par ci par là.... histoire de voir comment tu l'as organisé réellement..

Penses aussi à faire des echo / print_r de tes variables pour savoir ce qu'elles contiennent réellement....

Sachant que pour calculer la différence entre deux dates, tu peux utiliser
date_default_timezone_set('Europe/Paris');

$today = date('Y-m-d');
$d1 = new DateTime('2000-01-01');
$d2 = new DateTime($today);
$diff = $d2->diff($d1);

$age = $diff->y;

echo "age : ".$age;

Commenter la réponse de jordane45
Michel2107 89 Messages postés jeudi 28 juin 2007Date d'inscription 15 juin 2018 Dernière intervention - Modifié par Michel2107 le 8/06/2018 à 12:41
0
Merci
Oui c'est vrai désolé j'ai omis de préciser ça
La BDD est constituée d'un id (auto-inrémenté), du nom de la personne (varchar), du jour de naissance (int), du mois de naissance (int), du poste (varchar - c est un site sur un club de foot) et donc de l'année de naissance (int) que j'ai ajouté (comme je l'ai précisé, sans l'ajout du script concernant l'année, le code fonctionne nickel)

Voici mon code (j ai volontairement caché les infos de connexion a la base) je le publie comme ça, quand je le mets entre les balises code, ca détruit la mise en page , ça met tout a la suite c est illisible

<?php
$serveur = "adresse de l hote";
$base = "nom de la base";
$user = "nom d utilisateur";
$pass = "mot de passe";

/*
$mysqli est une nouvelle instance de la classe mysqli
prédéfinie dans php et hérite donc de ses propriétés et méthodes
connexion à la base de données
  • /

$connexion = new mysqli($serveur, $user, $pass, $base);
// si la connexion se fait en UTF-8, sinon ne rien indiquer
$connexion->set_charset("utf8");
/*
utilisation de la méthode connect_error
qui renvoie un message d'erreur si la connexion échoue
  • /

if ($connexion->connect_error) {
die('Erreur de connexion ('.$connexion->connect_errno.')'. $connexion->connect_error);
}
?>

<?php
$mois_en_cours = date("m");
$date_du_jour = date("d");
$annee_en_cours = date("Y");
switch($mois_en_cours)
{
case '01':
echo'<span class="couleur2arial12grassouligne"><p align="center">Mois de janvier</p></span>';
break;

case '02':
echo'<span class="couleur2arial12grassouligne"><p align="center">Mois de février</p></span>';
break;

case '03':
echo'<span class="couleur2arial12grassouligne"><p align="center">Mois de mars</p></span>';
break;

case '04':
echo'<span class="couleur2arial12grassouligne"><p align="center">Mois d\'avril</p></span>';
break;

case '05':
echo'<span class="couleur2arial12grassouligne"><p align="center">Mois de mai</p></span>';
break;

case '06':
echo'<span class="couleur2arial12grassouligne"><p align="center">Mois de juin</p></span>';
break;

case '07':
echo'<span class="couleur2arial12grassouligne"><p align="center">Mois de juillet</p></span>';
break;

case '08':
echo'<span class="couleur2arial12grassouligne"><p align="center">Mois d\'août</p></span>';
break;

case '09':
echo'<span class="couleur2arial12grassouligne"><p align="center">Mois de septembre</p></span>';
break;

case '10':
echo'<span class="couleur2arial12grassouligne"><p align="center">Mois d\'octobre</p></span>';
break;

case '11':
echo'<span class="couleur2arial12grassouligne"><p align="center">Mois de novembre</p></span>';
break;

case '12':
echo'<span class="couleur2arial12grassouligne"><p align="center">Mois de décembre</p></span>';
break;

default :
echo 'Mois inconnu' ;
break;

}



// ...Requete...
$requete = "SELECT nom, jour_anniv, poste from table_anniversaire WHERE mois_anniv = $mois_en_cours ORDER BY jour_anniv";

$req = mysqli_query($connexion, $requete);

/* Détermine le nombre de lignes du jeu de résultats */
$nombre_lignes = $req->num_rows;

if($nombre_lignes > 0 ){

while($data = mysqli_fetch_assoc($req)) {
{
$nom = htmlspecialchars($data['nom']);
$jour = $data['jour_anniv'];
$poste= $data['poste'];
$annee= $data['annee'];

if($mois_en_cours<mois_de_naissance)
{
$age = $annee_en_cours - $annee_de_naissance - 1 ; //car anniversaire pas encore passé
}
else
{
$age = $annee_en_cours - $annee_de_naissance ; // car anniversaire atteint
}


switch($jour)
{
case 1:
echo '<span class="couleur2arial12gras">le 1<sup>er</sup> '. $nom .'('. $poste .') - ' .$age.' ans</span><br />';
break;

case $date_du_jour :
echo '<img src="images/cadeau.png" title="C\'est son anniversaire aujourd\'hui. Joyeux anniversaire !"> <span class="anniversaire">le '.$jour.' : '. $nom .' (' .$poste.') - ' .$age.' ans </span><br />';
break;

default :
echo '<span class="couleur2arial12gras">le '.$jour.' : ' . $nom .' (' .$poste.') - ' .$age.' ans </span><br />';
break;
}
}
}
mysqli_free_result ($req);



}else{
// aucun résultat
echo '<span class="couleur2arial12gras">Pas d\'anniversaire ce mois ci</span>';
}
?>

--
jordane45 22146 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 21 août 2018 Dernière intervention - 11 juin 2018 à 22:59
Ce qui m'étonne.. c'est que tu n'avais pas de message d'erreur t'indiquant que ta variable n'existait pas..
As tu activé les erreurs PHP ? C'est un minimum lorsqu'on code.
Je t'invite à lire (et à appliquer) le contenu de ce lien : http://www.commentcamarche.net/faq/48399-php-gestion-des-erreurs-debogage-et-ecriture-du-code

NB: A l'avenir, lorsque tu posteras du code sur le forum, merci d'utiliser les BALISES DE CODE.
Explications ici: http://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code
Michel2107 89 Messages postés jeudi 28 juin 2007Date d'inscription 15 juin 2018 Dernière intervention > jordane45 22146 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 21 août 2018 Dernière intervention - 11 juin 2018 à 23:26
Justement c'est ce qui m'a perturbé, je n'avais aucune erreur PHP , juste un calcul qui ne prenait pas en compte l'année de naissance. C'est pour cela que je ne voyais pas ou pouvait être mon erreur
Michel2107 89 Messages postés jeudi 28 juin 2007Date d'inscription 15 juin 2018 Dernière intervention - 11 juin 2018 à 23:33
J'ai regardé la configuration PHP de mon hébergeur, pourtant la Configuration Php de: display_errors est sur On (donc l'affichage d erreur aurait du se faire).

Par contre j'utilise les balises de code je ne l ai pas fait pour mon code entier car ça modifiait toute la mise en forme, ça devenait illisible (c est pour cela qu'il y a autant de temps entre la date du post et la date de modification, j'avais édité plusieurs fois le code pour essayer de le mettre entre les balises de code)
jordane45 22146 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 21 août 2018 Dernière intervention - 12 juin 2018 à 01:04
Balises de code AVEC le langage précisé = aucun souci de mise en forme.
jordane45 22146 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 21 août 2018 Dernière intervention - 12 juin 2018 à 01:05
Et pour le display error..ca ne fait pas tout.
Il faut afficher TOUTES les erreurs. D'ou les lignes de code que je t'ai donné.
Commenter la réponse de Michel2107
Michel2107 89 Messages postés jeudi 28 juin 2007Date d'inscription 15 juin 2018 Dernière intervention - Modifié par Michel2107 le 15/06/2018 à 05:25
0
Merci
ok merci

--
Commenter la réponse de Michel2107

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.