Début en php
Bonjour, je débute en PHP. Je dois faire un prog qui calcule la différence entre 2 dates.
Donc j'ai une page HTML qui demande la date de naissance, je calcule la différence entre la date du jour et la date actuelle. Je compare ensuite le mois et le jour pour savoir si mon anniversaire est passé.
Jusque la tout va bien, mais je foire complètement pour moi calculer l'age en mois ou en jours ou en heure.
Si quelqu'un savait me donner une piste, Merci
Réponses apportées à cette discussion
Salut,
c'est davantage une question de logique que de langage.
Le point de départ, en dehors des dates elles-même, c'est le format de ces dates. Ensuite, je suggère de formuler de façon simple la manière dont on calcule une différence de date : il faut commencer par la plus grande unité à savoir les années, puis on passe aux mois et enfin aux jours. Ça implique qu'on doit commencer par isoler les différents éléments constitutifs d'une date. Prenons un exemple : quelqu'un né le 15 avril 1980. Si la date est sous la forme 15/04/1980, on va récupérer les éléments de la date avec la fonction explode() :
<?php
$eltsDate = explode('/', $date);
//...
Notre variable $eltsDate est un tableau contenant trois éléments, 15, 04 et enfin 1980. Ensuite, on va récupérer les mêmes éléments de la date courante :
<?php
$eltsAujourdhui = array(
date('d'),
date('m'),
date('Y')
);
Allez, c'est ton point de départ, à toi de jouer, explique (dans tes propres mots en français, il sera toujours temps ensuite de traduire en code) comment tu vas calculer la différence ?
Salut, merci de ta réponse, mais je n'ai pas encore appris les tableau ni la fonction explode, je dois faire cela juste avec des vérification if ...
Et pourtant... ce n'est vraiment pas compliqué.
Mais bon, dans ce cas, ça implique que la date saisie dans ta page HTML sera issue de trois champs distincts du formulaire, un pour le jour, un pour le mois et un pour l'année, de telle sorte que tu puisses effectuer les calculs sans utiliser de tableaux.
Il va falloir comparer les années, puis comparer les mois et enfin comparer les jours.
Il faut donc récupérer les données du formulaire : sais-tu faire ça ?
Ensuite, il faut définir des variables contenant les valeurs composant la date courante. Mais au lieu de faire ceci :
<?php
$eltsAujourdhui = array(
date('d'),
date('m'),
date('Y')
);
Qui donnerait un tableau, tu peux faire ceci :
<?php
$jour = date('d');
$mois = date('m');
$annee = date('Y');
Et là tu auras trois variables distinctes.
Essaye de me décrire le processus, et s'il y a des erreurs, je tâcherai de te remettre sur le chemin.
Merci, alors apres le rapatriement des données du formulaire, je vais calculer l'âge théorique en année ($age=$annee-$anneenaissance). Apres je vais comparer le mois de naissance par rapport au mois actuel (si $moisnaiss<$mois alors $age=$age-1) et si $moisnaiss=$mois alors je compare le jour $joursnaiss<$jours alors $age=$age-1
Mon raisonnement est bon?
Ok, à ce stade, ça tient la route, sauf que tu as inversé au niveau du mois : tu ne feras $age - 1 que si le mois de naissance est supérieur et non inférieur au mois courant. Prends l'exemple suivant : date de naissance le 01/07/1985 => 2013 - 1985 = 28; mais le mois de naissance est supérieur (07) au mois courant (06), donc on a pas encore atteint 28 qui n'aura lieu qu'en juillet. Pareil pour le jour.
Mais l'idée générale est bonne : comment vas-tu maintenant traduire ça en code ?
Ben ca devrait etre ca, mais apparemment non parce que ca fonctionne pas
<?php
$prenom = $_POST['prenom'];
$nom = $_POST['nom'];
$jourdenaissance=$_POST['jourdenaissance'];
$moisdenaissance=$_POST['moisdenaissance'];
$anneedenaissance=$_POST['anneedenaissance'];
$jour = date('d');
$mois = date('m');
$annee = date('Y');
$age=$anne-$anneedenaissance
if ($moisdenaissance>$mois) {$age=$age-1}
if ($moisdenaissance<=$mois && $jourdenaissance<=$jours) {
echo"votre age est : ";$age}
}
Décompose davantage :
Pour l'année, on est bon, mais c'est la suite qui n'est pas optimisée. Définis ton algorithme comme ceci :
Si le mois de naissance est supérieur au mois courant alors
... instruction ...
Sinon
... autre instruction ...
Fin Si.
Et tu peux parfaitement imbriquer des structures de contrôle, par exemple :
Si le mois de naissance est supérieur au mois courant alors
... instruction ...
Sinon
Si telle condition Alors
... instruction ...
Sinon
... instruction ...
Fin Si.
Fin Si.
C'est un langage plus facile à suivre au départ et ensuite seulement tu pourras le traduire en code PHP, mais dans l'immédiat, il faut que tu arrives à bien suivre la logique du raisonnement.
Si le mois de naissance est supérieur au mois courant alors
l'age est egal à l'age-1
Sinon si le mois de naissance est inférieur ou égal au mois courant alors
si le jour de naissance est inférieur ou égal au jour courrant alors
afficher l'age
Fin si
Fin si
Fin si
Décompose davantage. Prends plusieurs exemples, 01/07/1985, 01/05/1985 et 30/06/1985. Ton algorithme va donner le bon résultat pour la première date et pour la troisième mais sera faux pour la seconde : pourquoi ?
euh alors la je vois pas, je dois avoir de sérieux problèmes de compréhension de la logique
Ben si : avec le 30/06/1985, ça donnerait ça :
Âge = 2013 - 1985 = 28;
Le mois de naissance est bien inférieur ou égal au mois courant (06 // 06) donc ça ne change rien et ensuite, tu ne traites pas le cas où je jour de naissance est supérieur au jour courant...
Si tu décomposes lentement la manière naturelle de calculer, il se passe quoi ? trois cas pour le mois, le mois de naissance est supérieur, égale ou inférieur. S'il est supérieur, on va retirer 1 à l'âge et no ira pas plus loin, sinon, il reste deux cas : si le mois est inférieur, on ne s'en occupe pas, par contre, s'il est égal, alors ça dépend du jour : soit le jour de naissance est supérieur et on doit retirer 1 à l'âge, soit il est inférieur ou égal et on ne change rien. Le résultat normal devrait donc être 27.
Ensuite seulement on affiche le résultat. Ce point signifie que tu n'as pas besoin d'avoir un « echo » dans les if/else, contentes toi de définir la valeur de $age et ne fais un « echo » qu'après la fin des structures de contrôle.
Essaye de redéfinir les SI/SINON/FIN SI en traitant chaque possibilité d'abord pour le mois, ensuite, imbrique une structure pour le jour i c'est approprié.
oki je crois avoir compris, en tout cas je te remercie déjà de ta patience et de tes explication
Si le mois de naissance est supérieur au mois courant alors
l'age est egal à l'age-1
Sinon si le mois de naissance est inférieur ou égal au mois courant alors
si le jour de naissance est inférieur ou égal au jour courant alors
afficher l'age sinon age=age-1
Fin si
Fin si
Fin si
Non, tu as encore une erreur.
Tu traites le cas du mois de naissance « inférieur ou égal »... mais justement, c'est là qu'est l'erreur. Relis bien ma précédente réponse ;)
non, si je met:
si le jour de naissance est inférieur ou égal au jour courant alors
afficher l'age sinon age=age-1
donc pour moi (mais je me trompe peut-etre) si le jour est inférieur ou égal l'age est bon SINON on retire 1 an
Tu as sauté une étape : le problème est sur le test au niveau du mois. Tu as deux cas à traiter, le cas du mois égal au mois courant et le cas du mois inférieur au mois courant.
ok donc si je reprends juste les instructions:
Si moisn< moisa age=age-1
sinon si moisn>= moisa alors si journ
oups une partie n'a pas été copiée
Si moisn< moisa age=age-1
sinon si moisn>= moisa alors si journ>=joura alors age=age-1
sinon si journ<joura alors age=age
Ne suis pas des instructions, suis la logique.
SI moisnaissance > moiscourant ALORS
... instruction ...
SINON
SI moisnaissance = moiscourant ALORS
... instruction ... et c'est ici que le point est à observer attentivement...
SINON
... instruction ...
FIN SI
FIN SI
SI moisnaissance > moiscourant ALORS age=age-1
SINON
SI moisnaissance <= moiscourant ALORS
SI journaissance > jouractuel ALORS age=age
SINON si journaissance<= jouractuel alors age=age-1
FIN SI
FIN SI
FIN SI
Fin SI
Décidément...
Si tu testes le raisonnement avec différentes dates, est-ce que ça donne le résultat attendu ? Pour la présentation, utilise une indentation :
age = anneecourante moins anneenaissance;
SI moisnaissance > moiscourant ALORS
age=age-1
SINON
SI moisnaissance <= moiscourant ALORS
SI journaissance > jouractuel ALORS
age=age
SINON
SI journaissance<= jouractuel ALORS
age=age-1
FIN SI
FIN SI
FIN SI
FIN SI
Suis bien le déroulement avec 30/06/1985 : pour l'année, on passe, maintenant, premier test, est-ce que le mois est supérieur au mois courant ? Non, donc on passe dans le SINON, Est-ce que moisnaissance est inférieur ou égal à moiscourant ? Oui, donc on passe au troisième test : est-ce que journaissance est supérieur à jourcourant ? OUI, donc rien ne se passe et on garde l'âge défini avant le premier IF... et c'est faux, puisque on a défini 28 alors que c'est 27 : pourquoi ?
Il y a un détail important que j'ai indiqué deux fois : tu as trois tests possibles sur le mois, mais tu en combines deux là où il ne le faudrait pas.
En fait je dois juste inverser les 2:
SI journaissance > jouractuel ALORS
age=age-1
SINON
SI journaissance<= jouractuel ALORS
age=age
PS: je ne sais pas comment faire l'indentation, j'ai essayé avec code mais ca a pas l'air de fonctionner
Non, tu auras une erreur sur une date précédente.
Je vais essayer de formuler autrement : comment dois-tu tester les mois ? Réfléchis bien, si tu ne réalises pas que c'est là le point essentiel de ton algorithme. Par ailleurs, il faut que, lorsque tu mets un algorithme au point, tu testes avec différentes dates pour voir si le résultat attendu est correct ou non.
Si MN
Si JN>JA alors Age=Age-1
Sinon Si JN<=JA alors Age=Age
Là j'ai essayé avec les 3 dates que tu m'as donné et ca fonctionne
01/07/1985 : NON --> OUI --> age= 27
01/05/1985: OUI -->28
30/06/1985 : NON--> OUI --> OUI --> age=27
14/06/1985 : NON --> NON --> OUI --> age 27
Enfin :)
Il ne reste donc plus maintenant qu'à traduire ça en code. Mais le point important à comprendre, c'est que 50% d'un développement consiste au préalable à analyser le problème. Si le problème est correctement analysé, le code devient beaucoup plus simple`à écrire ;)
Merci beaucoup de ton aide et de ta patience, je vais maintenant m'atteler a traduire cela en php
Aille du mal avec le php aussi:
$joursact) {$age=$age-1}; elseif ($jourdenaissance<=$joursact) {$age=$age}; { ?>
Il me met:
( ! ) Parse error: syntax error, unexpected '}' in E:\wamp\www\age\calculdelage.php on line 16
ligne 16 : if ($jourdenaissance>$joursact) {$age=$age-1};
Ok, alors là, on va aborder un autre aspect au moins aussi important de la programmation : rigueur et discipline.
On va remettre en forme ton code et je vais te laisser découvrir l'erreur :
<?php
$joursact)
{
$age=$age-1
};
elseif($jourdenaissance<=$joursact)
{
$age=$age
};
{
?>
Il en manque des bouts, je t'invite à compléter en respectant la mise en forme. Pour que ça s'affiche correctement ici, décale les blocs de code de quatre espace vers la droite.
en fait il manque la moitié de mon code, comment tu fais pour le mettre qu'on le voit et qu'il garde l'aspect que je lui avait donne en le mettant sur le forum (que ca apparaisse comme dans un rectangle?)
Comme indiqué plus tôt :
Pour que ça s'affiche correctement ici, décale les blocs de code de quatre espace vers la droite.
pas encore ça, et surtout, mets le code complet, ça aidera à la compréhension
ben la j'ai mi le code complet avec le retrait de 4 espace, mais ca passe pas
$prenom = $_POST['prenom'];
$nom = $_POST['nom'];
$jourdenaissance=$_POST['jourdenaissance'];
$moisdenaissance=$_POST['moisdenaissance'];
$anneedenaissance=$_POST['anneedenaissance'];
$jouract = date('d');
$moisact = date('m');
$anneeact = date('Y');
$age=$anneact-$anneedenaissance;
if ($moisdenaissance<$moisact) {
if ($jourdenaissance>$joursact) {
$age=$age-1;
} elseif ($jourdenaissance<=$joursact) {
$age=$age;
}
}
Ok, c'est mieux , mais une petite remise en forme s'impose :
<?php
$prenom = $_POST['prenom'];
$nom = $_POST['nom'];
$jourdenaissance = $_POST['jourdenaissance'];
$moisdenaissance = $_POST['moisdenaissance'];
$anneedenaissance = $_POST['anneedenaissance'];
$jouract = date('d');
$moisact = date('m');
$anneeact = date('Y');
$age = $anneact - $anneedenaissance;
if ($moisdenaissance<$moisact)
{
if ($jourdenaissance>$joursact)
{
$age=$age-1
};
elseif ($jourdenaissance<=$joursact)
{
$age=$age
};
{
?>
Observe et tâche de voir si rien te te semble inapproprié.
ben toute mes accolades sont bien fermée, mes parenthèses aussi
j'ai oublié un e dans $age = $anneact - $anneedenaissance;
mais je ne crois pas que ce soit ca
Peut-être le $age=$age ?
Non : observe où sont les « ; » qui devraient terminer des instructions. Quant aux accolades, la dernière te semble-t-elle normale ?
Note bien que je n'ai strictement rien modifié, juste remis en forme.
j'ai essayé de les mettre devant les accolades, mais alors j'ai 7 messages, d'erreurs, donc je ne vois vraiment pas
Essaye donc comme ceci :
<?php
$prenom = $_POST['prenom'];
$nom = $_POST['nom'];
$jourdenaissance = $_POST['jourdenaissance'];
$moisdenaissance = $_POST['moisdenaissance'];
$anneedenaissance = $_POST['anneedenaissance'];
$jouract = date('d');
$moisact = date('m');
$anneeact = date('Y');
$age = $anneact - $anneedenaissance;
if ($moisdenaissance > $moisact)
{
$age = $age - 1;
}
else
{
if($moisdenaissance == $moisact && $jourdenaissance > $joursact)
{
$age = $age - 1;
}
}
?>
Cette fois-ci, j'ai apporté des correctifs et retiré des éléments devenus inutiles. Observe les différences avec ton propre code.
Plus tôt, j'évoquais « rigueur et discipline » : ce sont des éléments indispensables pour ne pas dire impératifs en programmation. Si on ouvre une accolade ou une parenthèse, on la referme immédiatement avant de mettre quelque instruction que ce soit dedans. Lorsqu'on écrit une instruction, on la termine obligatoirement par un point-virgule. Indentation du code avec des espaces (et non des tabulations pour des questions de portabilité sur différents systèmes et différents éditeurs de codes, d'autant plus important si on travail en équipe sur un projet)
En suivant ces règles, on économise énormément de temps en débogage sur des erreurs vraiment basiques mais parfois difficiles à repérer.
localhost/age/calculdelage.php?nom=jean&prenom=raoul&jourdenaissance=11&moisdenaissance=02&anneedenaissance=1974
il me met cela comme erreur:
( ! ) Notice: Undefined index: prenom in E:\wamp\www\age\calculdelage.php on line 2
Call Stack
Time Memory Function Location
1 0.0005 677552 {main}( ) ..\calculdelage.php:0
( ! ) Notice: Undefined index: nom in E:\wamp\www\age\calculdelage.php on line 3
Call Stack
Time Memory Function Location
1 0.0005 677552 {main}( ) ..\calculdelage.php:0
( ! ) Notice: Undefined index: jourdenaissance in E:\wamp\www\age\calculdelage.php on line 4
Call Stack
Time Memory Function Location
1 0.0005 677552 {main}( ) ..\calculdelage.php:0
( ! ) Notice: Undefined index: moisdenaissance in E:\wamp\www\age\calculdelage.php on line 5
Call Stack
Time Memory Function Location
1 0.0005 677552 {main}( ) ..\calculdelage.php:0
( ! ) Notice: Undefined index: anneedenaissance in E:\wamp\www\age\calculdelage.php on line 6
Call Stack
Time Memory Function Location
1 0.0005 677552 {main}( ) ..\calculdelage.php:0
( ! ) Notice: Undefined variable: anneact in E:\wamp\www\age\calculdelage.php on line 12
Call Stack
Time Memory Function Location
1 0.0005 677552 {main}( ) ..\calculdelage.php:0
Est-ce que dans la balise
<
form> de ton formulaire l'attribut « method » a bien pour valeur « post » ?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Calcul de l'age</title>
</head>
<body>
<form action="calculdelage.php" method="post" name="calculdelage">
<br>
<br>Nom: <input name="nom" type="text" size="30" maxlength="30" />
<br>Prénom: <input name="prenom" type="text" size="30" maxlength="30" />
<br>Date de naissance:
<input name="jourdenaissance" type="text" size="2" maxlength="2" /> /
<input name="moisdenaissance" type="text" size="2" maxlength="2" /> /
<input name="anneedenaissance" type="text" size="4" maxlength="4" />
<br><br>
<input type="submit" value="Envoyer"/>
</form>
</body>
</html>
Ok, donc je devine autre chose : tout c code est dans la même page. Lors du chargement initial, la super-globale $_POST est vide, d'où ces messages d'erreur.
Tu peux donc corriger ça et ça te donne l'opportunité d'un autre exercice avec IF/ELSE
En d'autres termes, s'il s'agit du premier chargement, $_POST['nom'] n'existera pas, ce qu'on peut tester avec isset(), l'algo serait donc :
SI $_POST['nom'] existe alors
traitement du formulaire
SINON
affichage normal du formulaire
FIN SI
$moisact)
{
$age = $age - 1;
}
else
{
if($moisdenaissance == $moisact && $jourdenaissance > $joursact)
{
$age = $age - 1;
else {
echo"vide";
{
}
?>
Avec ce code, tu as probablement les mêmes erreurs. Regarde les messages d'erreur, ils indiquent un numéro de ligne.
( ! ) Parse error: syntax error, unexpected T_ELSE in E:\wamp\www\age\calculdelage.php on line 24
Qu'est-ce qu'il y a aux lignes 23 et 24 ?
23 $age = $age - 1;
24 else {
25 echo"vide";
26 {
Ok, remonte un peu avant : le message indique que le ELSE est inattendu. Ça veut dire que le IF est manquant ou alors qu'une accolade fermante est manquante. Inspecte ton code avec logique et rigueur.
je ne vois pas
if (isset($prenom))
{
if ($moisdenaissance > $moisact)
{
$age = $age - 1;
}
else
{
if($moisdenaissance == $moisact && $jourdenaissance > $joursact)
{
$age = $age - 1;
}
}
else
{
echo"vide";
{
}
?>
Tu es certain d'avoir bien inspecté les accolades ???
J'ai édité ton message pour remettre en forme : laisse toujours une ligne vide avant un bloc de code.
oui j'en ai 5 ouvertes et 5 fermees
J'ai idée que tu ne saisis pas correctement la manière d'utiliser des accolades. Elles ne doivent pas seulement être toutes fermées, elles doivent aussi se positionner aux bons endroits.
en fait par rapport a ton code, j'ai juste ajouté
if (isset($prenom))
{
et
else
{
echo"vide";
{
}
On, alors je vais tâcher de te montrer :
1 if (isset($prenom))
2 {
3 if ($moisdenaissance > $moisact)
4 {
5 $age = $age - 1;
6 }
7 else
8 {
9 if($moisdenaissance == $moisact && $jourdenaissance > $joursact)
10 {
11 $age = $age - 1;
12 }
13 }
14 else
15 {
16 echo"vide";
17 {
18 }
19 ?>
Explique moi l'accolade à la ligne 13
oki, maintenant mes accolades c'est bon, mais j'ai de nouveau les 7 msg d'erreurs
Bien, alors reprenons : Les erreurs indiquent des numéros de lignes, commence par la première et repense à ce que j'expliquais plus tôt.
en fait c'est toujours les déclarations de variable qui posent problèmes. D’après ce que j'ai vu sur les site isset retourne vrai ou faux, mais comme je ne connais pas encore suis pas sur de l'utilisation
$prenom = $_POST['prenom'];
$nom = $_POST['nom'];
$jourdenaissance = $_POST['jourdenaissance'];
$moisdenaissance = $_POST['moisdenaissance'];
$anneedenaissance = $_POST['anneedenaissance'];
$jouract = date('d');
$moisact = date('m');
$anneeact = date('Y');
Ben tâche d'être logique : tu affiches ta page et ça génère ces messages, donc il y a des instruction qui devraient être exécutées à une certaine condition, je t'ai donné la piste plus tôt.
oui je crois que j'ai compris, en fait il faut tester toutes les variable pour voir si elles sont remplie, c'est ca? Mais de toute façon, si elles ne sont pas remplies, on doit faire quoi?
Tu as raté une étape dans les indications que je t'ai données plus tôt.
SI $_POST['nom'] existe alors
traitement du formulaire
SINON
affichage normal du formulaire
FIN SI
Pars sur cette base et tâche d'avoir une approche plus fonctionnelle que technique.
je ne sais pas comment on réaffiche un formulaire qui se trouve dans un autre fichier.
J'ai essayé avec juste :
$prenom = $_POST['prenom'];
$nom = $_POST['nom'];
$jourdenaissance = $_POST['jourdenaissance'];
$moisdenaissance = $_POST['moisdenaissance'];
$anneedenaissance = $_POST['anneedenaissance'];
$jouract = date('d');
$moisact = date('m');
$anneeact = date('Y');
$age = $anneact - $anneedenaissance;
if (isset($prenom)) {
echo "ok";
} else {
echo "vide";
}
la réponse:
( ! ) Notice: Undefined index: prenom in E:\wamp\www\age\calculdelage.php on line 2
Call Stack
# Time Memory Function Location
1 0.0002 676232 {main}( ) ..\calculdelage.php:0
( ! ) Notice: Undefined index: nom in E:\wamp\www\age\calculdelage.php on line 3
Call Stack
# Time Memory Function Location
1 0.0002 676232 {main}( ) ..\calculdelage.php:0
( ! ) Notice: Undefined index: jourdenaissance in E:\wamp\www\age\calculdelage.php on line 4
Call Stack
# Time Memory Function Location
1 0.0002 676232 {main}( ) ..\calculdelage.php:0
( ! ) Notice: Undefined index: moisdenaissance in E:\wamp\www\age\calculdelage.php on line 5
Call Stack
# Time Memory Function Location
1 0.0002 676232 {main}( ) ..\calculdelage.php:0
( ! ) Notice: Undefined index: anneedenaissance in E:\wamp\www\age\calculdelage.php on line 6
Call Stack
# Time Memory Function Location
1 0.0002 676232 {main}( ) ..\calculdelage.php:0
( ! ) Notice: Undefined variable: anneact in E:\wamp\www\age\calculdelage.php on line 12
Call Stack
# Time Memory Function Location
1 0.0002 676232 {main}( ) ..\calculdelage.php:0
vide
j'ai trouvé en mettant la méthode GET au lieux de POST, ca fonctionne
Ce n'est pas une solution parce que du coup le traitement des données ne fonctionnera pas.
Mais enfin regarde : l'erreur indique la ligne 2 et tu mets le if() sur le prénom ligne 14...
il faut mettre les if avant les variables ?
Ben à ton avis : est-ce que cette solution te paraitrait logique ou non ? Que va-t-il se passer dans ce cas ?
ben non c'est pas logique, elles seront de toute façon vide ...
Au premier chargement oui, mais lorsque tu soumettras le formulaire, il va se passer quoi ?
Je ne sais pas, je t'avoue que je suis sur "ce bête" truc depuis 2 jours et là, je sature complètement, plus moyen de réfléchir. Mon formateur à peut-être raison, j'ai qu'a faire maçon au moins il faut pas réfléchir...
En tout cas je te remercie d'avoir passé tout ton dimanche a avoir essayé de me faire comprendre plein de choses
C'est pourtant de la simple logique, regarde :
<?php
/* Si le formulaire est envoyé, on traite les données */
if(isset($_POST['nom']))
{
$prenom = $_POST['prenom'];
$nom = $_POST['nom'];
$jourdenaissance = $_POST['jourdenaissance'];
$moisdenaissance = $_POST['moisdenaissance'];
$anneedenaissance = $_POST['anneedenaissance'];
$jouract = date('d');
$moisact = date('m');
$anneeact = date('Y');
$age = $anneact - $anneedenaissance;
if ($moisdenaissance > $moisact)
{
$age = $age - 1;
}
else
{
if($moisdenaissance == $moisact && $jourdenaissance > $joursact)
{
$age = $age - 1;
}
}
}
?>
<!-- Affichage du formulaire -->
<form action="">
<!-- etc... -->
oui vu comme ca c'est évident et au niveau du formulaire, je dois recopier tout ce qu'il y avait dans ma page de formulaire.html?
Pourquoi les variable ne se remplissent pas la première fois?
Tant que le formulaire n'est pas envoyé, la super-globale POST restera vide. Donc au premier affichage, on a rien dedans, le traitement devient donc inutile. Par la suite, ¸a affiche le formulaire. Tu remplis les champs, tu cliques sur le bouton et là, ta variable POST contient les informations expédiées.
Plus clair comme ça ?
ben non parce que l'utilisateur devra remplir 2 fois le formulaire, si je met tout dans la même page est-ce que ca passera dès la première fois?
et en plus il m'affiche continuellement le formulaire en dessous du résultat
Reprends ce que je t'ai indiqué plus haut : là, j'ai mis un IF, mais pas de ELSE, je te laisse faire ;)
purée je suis vraiment un boulet!!!
En tout cas encore un grand merci pour tout
;)
j'ai été top vite
( ! ) Parse error: syntax error, unexpected '<' in E:\wamp\www\age\calculdelage.php on line 34( ! ) Parse error: syntax error, unexpected '<' in E:\wamp\www\age\calculdelage.php on line 34
j'ai juste ajouté a la fin :
else
{
<form action="calculdelage.php" method="POST" name="calculdelage">
<br>
<br>Nom: <input name="nom" type="text" size="30" maxlength="30" />
<br>Prénom: <input name="prenom" type="text" size="30" maxlength="30" />
<br>Date de naissance: <input name="jourdenaissance" type="text" size="2" maxlength="2" />/
<input name="moisdenaissance" type="text" size="2" maxlength="2" />/
<input name="anneedenaissance" type="text" size="4" maxlength="4" />
<br><br>
<input type="submit" value="Envoyer">
</form>
}
?>
la ligne 34 c'est
<form action ....>
Normal, tu mélanges HTML et PHP : tu as oublié un point important...
Be oui je sais qu'il faut fermer le ?> avant de mettre le html, mais la comme c'est a l’intérieur d'une condition, je vois pas comment faire
Oui, et en ouvrant à nouveau avant l'accolade de fermeture,ce qui se trouve entre le ?> et l'ouverture ne sera pas interprété et ne génèrera pas d'erreur.
//..
{
?>
code HTML
<?php
}
// code PHP
Maintenant, il ne met plus d'erreur, mais il n'affiche plus rien
<?php
/* Si le formulaire est envoyé, on traite les données */
if(isset($_POST['nom']))
{
$prenom = $_POST['prenom'];
$nom = $_POST['nom'];
$jourdenaissance = $_POST['jourdenaissance'];
$moisdenaissance = $_POST['moisdenaissance'];
$anneedenaissance = $_POST['anneedenaissance'];
$jouract = date('d');
$moisact = date('m');
$anneeact = date('Y');
$age = $anneeact - $anneedenaissance;
if ($moisdenaissance > $moisact)
{
$age = $age - 1;
echo "age=".$age;
}
else
{
if($moisdenaissance == $moisact && $jourdenaissance > $joursact)
{
$age = $age - 1;
echo "age=".$age;
}
}
}
else {
?>
<form action="calculdelage.php" method="POST" name="calculdelage">
<br>
<br>Nom: <input name="nom" type="text" size="30" maxlength="30" />
<br>Prénom: <input name="prenom" type="text" size="30" maxlength="30" />
<br>Date de naissance: <input name="jourdenaissance" type="text" size="2" maxlength="2" />/
<input name="moisdenaissance" type="text" size="2" maxlength="2" />/
<input name="anneedenaissance" type="text" size="4" maxlength="4" />
<br><br>
<input type="submit" value="Envoyer">
</form>
<?php
}
?>
C'est ça
ben non, il affiche plus rien du tout
Bizarre.
Ajoute un attribut « name » au bouton submit, ( name="envoi" par exemple) et en début de code, ajuste le isset en mettant $_POST['envoi']
il affiche une fois le questionnaire et puis, plus rien
Ok, je viens de voir pourquoi. Ton echo est mal placé et ne s'affichera que dans un cas : même mois mais jour ultérieur.
Essaye comme ceci :
<?php
/* Si le formulaire est envoyé, on traite les données */
if(isset($_POST['envoi']))
{
$prenom = $_POST['prenom'];
$nom = $_POST['nom'];
$jourdenaissance = $_POST['jourdenaissance'];
$moisdenaissance = $_POST['moisdenaissance'];
$anneedenaissance = $_POST['anneedenaissance'];
$jouract = date('d');
$moisact = date('m');
$anneeact = date('Y');
$age = $anneeact - $anneedenaissance;
if ($moisdenaissance > $moisact)
{
$age = $age - 1;
}
else
{
if($moisdenaissance == $moisact && $jourdenaissance > $joursact)
{
$age = $age - 1;
}
}
echo "<p>age = ". $age ."</p>";
}
else
{
?>
<form action="calculdelage.php" method="post" id="calculdelage">
<p>
Nom: <input name="nom" type="text" size="30" maxlength="30" />
</p>
<p>
Prénom: <input name="prenom" type="text" size="30" maxlength="30" /><br>
</p>
<p>
Date de naissance: <input name="jourdenaissance" type="text" size="2" maxlength="2" />/
<input name="moisdenaissance" type="text" size="2" maxlength="2" />/
<input name="anneedenaissance" type="text" size="4" maxlength="4" />
</p>
<p>
<input type="submit" name="envoi" value="Envoyer" />
</p>
</form>
<?php
}
?>
il me met ( ! ) Parse error: syntax error, unexpected $end in E:\wamp\www\age\calculdelage.php on line 51
et il n'y a que 49 lignes ...
Ça signifie qu'une instruction n'est pas terminée correctement, point-virgule oublié, accolade non fermée ou ce genre de chose. Ordonne soigneusement ton code de façon à en faciliter la lecture avec une indentation régulière et une symétrie pour les accolades.
merci une accolade oubliée, ca marche nikel, encore merci.