Début en php

Rechercher

Début en php

Par ouinouin  -  88 reponses  -  Le 13/06/2013 20:01  -  Editer  - 

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

Par Cyrano  -  Le 14/06/2013 06:29  -  Haut de page  - 

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 ?

 
Par ouinouin  -  Le 15/06/2013 21:47  -  Haut de page  - 

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 ...

 
Par Cyrano  -  Le 15/06/2013 23:09  -  Haut de page  - 

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.

 
Par ouinouin  -  Le 16/06/2013 08:51  -  Haut de page  - 

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?

 
Par Cyrano  -  Le 16/06/2013 09:03  -  Haut de page  - 

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 ?

 
Par ouinouin  -  Le 16/06/2013 09:48  -  Haut de page  - 

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}
}
 
Par Cyrano  -  Le 16/06/2013 10:02  -  Haut de page  - 

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.

 
Par ouinouin  -  Le 16/06/2013 10:06  -  Haut de page  - 

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

 
Par Cyrano  -  Le 16/06/2013 10:15  -  Haut de page  - 

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 ?

 
Par ouinouin  -  Le 16/06/2013 10:24  -  Haut de page  - 

euh alors la je vois pas, je dois avoir de sérieux problèmes de compréhension de la logique

 
Par Cyrano  -  Le 16/06/2013 10:32  -  Haut de page  - 

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é.

 
Par ouinouin  -  Le 16/06/2013 10:41  -  Haut de page  - 

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

 
Par Cyrano  -  Le 16/06/2013 10:43  -  Haut de page  - 

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 ;)

 
Par ouinouin  -  Le 16/06/2013 10:53  -  Haut de page  - 

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

 
Par Cyrano  -  Le 16/06/2013 10:55  -  Haut de page  - 

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.

 
Par ouinouin  -  Le 16/06/2013 11:09  -  Haut de page  - 

ok donc si je reprends juste les instructions:

Si moisn< moisa age=age-1
sinon si moisn>= moisa alors si journ=joura alors age=age

 
Par ouinouin  -  Le 16/06/2013 11:14  -  Haut de page  - 

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

 
Par Cyrano  -  Le 16/06/2013 11:16  -  Haut de page  - 

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
 
Par ouinouin  -  Le 16/06/2013 11:24  -  Haut de page  - 

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

 
Par Cyrano  -  Le 16/06/2013 11:51  -  Haut de page  - 

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.

 
Par ouinouin  -  Le 16/06/2013 12:35  -  Haut de page  - 

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

 
Par Cyrano  -  Le 16/06/2013 12:39  -  Haut de page  - 

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.

 
Par ouinouin  -  Le 16/06/2013 13:02  -  Haut de page  - 

Si MN=MA alors
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

 
Par Cyrano  -  Le 16/06/2013 13:06  -  Haut de page  - 

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 ;)

 
Par ouinouin  -  Le 16/06/2013 13:07  -  Haut de page  - 

Merci beaucoup de ton aide et de ta patience, je vais maintenant m'atteler a traduire cela en php

 
Par ouinouin  -  Le 16/06/2013 13:25  -  Haut de page  - 

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};

 
Par Cyrano  -  Le 16/06/2013 13:30  -  Haut de page  - 

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.

 
Par ouinouin  -  Le 16/06/2013 13:32  -  Haut de page  - 

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?)

 
Par Cyrano  -  Le 16/06/2013 13:34  -  Haut de page  - 

Comme indiqué plus tôt :
Pour que ça s'affiche correctement ici, décale les blocs de code de quatre espace vers la droite.

 
Par ouinouin  -  Le 16/06/2013 13:35  -  Haut de page  - 
$joursact) {$age=$age-1}; elseif ($jourdenaissance<=$joursact) {$age=$age}; { ?>
 
Par Cyrano  -  Le 16/06/2013 13:36  -  Haut de page  - 

pas encore ça, et surtout, mets le code complet, ça aidera à la compréhension

 
Par ouinouin  -  Le 16/06/2013 13:38  -  Haut de page  - 

ben la j'ai mi le code complet avec le retrait de 4 espace, mais ca passe pas

 
Par ouinouin  -  Le 16/06/2013 13:39  -  Haut de page  - 
$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;
    }
}
 
Par Cyrano  -  Le 16/06/2013 13:45  -  Haut de page  - 

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é.

 
Par ouinouin  -  Le 16/06/2013 13:50  -  Haut de page  - 

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 ?

 
Par Cyrano  -  Le 16/06/2013 13:59  -  Haut de page  - 

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.

 
Par ouinouin  -  Le 16/06/2013 14:30  -  Haut de page  - 

j'ai essayé de les mettre devant les accolades, mais alors j'ai 7 messages, d'erreurs, donc je ne vois vraiment pas

 
Par Cyrano  -  Le 16/06/2013 14:59  -  Haut de page  - 

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.

 
Par ouinouin  -  Le 16/06/2013 15:05  -  Haut de page  - 


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

 
Par Cyrano  -  Le 16/06/2013 15:06  -  Haut de page  - 

Est-ce que dans la balise

<

form> de ton formulaire l'attribut « method » a bien pour valeur « post » ?

 
Par ouinouin  -  Le 16/06/2013 15:08  -  Haut de page  - 
<!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>
 
Par Cyrano  -  Le 16/06/2013 15:16  -  Haut de page  - 

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
 
Par ouinouin  -  Le 16/06/2013 15:33  -  Haut de page  - 

$moisact) { $age = $age - 1; } else { if($moisdenaissance == $moisact && $jourdenaissance > $joursact) { $age = $age - 1; else { echo"vide"; { } ?>

 
Par Cyrano  -  Le 16/06/2013 15:35  -  Haut de page  - 

Avec ce code, tu as probablement les mêmes erreurs. Regarde les messages d'erreur, ils indiquent un numéro de ligne.

 
Par ouinouin  -  Le 16/06/2013 15:39  -  Haut de page  - 

( ! ) Parse error: syntax error, unexpected T_ELSE in E:\wamp\www\age\calculdelage.php on line 24

 
Par Cyrano  -  Le 16/06/2013 15:40  -  Haut de page  - 

Qu'est-ce qu'il y a aux lignes 23 et 24 ?

 
Par ouinouin  -  Le 16/06/2013 15:44  -  Haut de page  - 


23 $age = $age - 1;
24 else {
25 echo"vide";
26 {

 
Par Cyrano  -  Le 16/06/2013 15:46  -  Haut de page  - 

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.

 
Par ouinouin  -  Le 16/06/2013 15:52  -  Haut de page  - 

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";
    {
}
?> 

 
Par Cyrano  -  Le 16/06/2013 15:54  -  Haut de page  - 

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.

 
Par ouinouin  -  Le 16/06/2013 15:58  -  Haut de page  - 

oui j'en ai 5 ouvertes et 5 fermees

 
Par Cyrano  -  Le 16/06/2013 16:00  -  Haut de page  - 

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.

 
Par ouinouin  -  Le 16/06/2013 16:02  -  Haut de page  - 

en fait par rapport a ton code, j'ai juste ajouté

if (isset($prenom)) 
{ 

et

   else
    {
    echo"vide";
    {
}

 
Par Cyrano  -  Le 16/06/2013 16:06  -  Haut de page  - 

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

 
Par ouinouin  -  Le 16/06/2013 16:06  -  Haut de page  - 

oki, maintenant mes accolades c'est bon, mais j'ai de nouveau les 7 msg d'erreurs

 
Par Cyrano  -  Le 16/06/2013 16:09  -  Haut de page  - 

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.

 
Par ouinouin  -  Le 16/06/2013 16:11  -  Haut de page  - 

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');

 
Par Cyrano  -  Le 16/06/2013 16:13  -  Haut de page  - 

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.

 
Par ouinouin  -  Le 16/06/2013 16:16  -  Haut de page  - 

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?

 
Par Cyrano  -  Le 16/06/2013 16:18  -  Haut de page  - 

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.

 
Par ouinouin  -  Le 16/06/2013 16:28  -  Haut de page  - 

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

 
Par ouinouin  -  Le 16/06/2013 16:33  -  Haut de page  - 

j'ai trouvé en mettant la méthode GET au lieux de POST, ca fonctionne

 
Par Cyrano  -  Le 16/06/2013 16:33  -  Haut de page  - 

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...

 
Par ouinouin  -  Le 16/06/2013 16:39  -  Haut de page  - 

il faut mettre les if avant les variables ?

 
Par Cyrano  -  Le 16/06/2013 16:40  -  Haut de page  - 

Ben à ton avis : est-ce que cette solution te paraitrait logique ou non ? Que va-t-il se passer dans ce cas ?

 
Par ouinouin  -  Le 16/06/2013 16:41  -  Haut de page  - 

ben non c'est pas logique, elles seront de toute façon vide ...

 
Par Cyrano  -  Le 16/06/2013 16:42  -  Haut de page  - 

Au premier chargement oui, mais lorsque tu soumettras le formulaire, il va se passer quoi ?

 
Par ouinouin  -  Le 16/06/2013 16:45  -  Haut de page  - 

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

 
Par Cyrano  -  Le 16/06/2013 16:49  -  Haut de page  - 

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... -->
 
Par ouinouin  -  Le 16/06/2013 16:56  -  Haut de page  - 

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?

 
Par Cyrano  -  Le 16/06/2013 16:58  -  Haut de page  - 

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 ?

 
Par ouinouin  -  Le 16/06/2013 17:07  -  Haut de page  - 

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

 
Par Cyrano  -  Le 16/06/2013 17:12  -  Haut de page  - 

Reprends ce que je t'ai indiqué plus haut : là, j'ai mis un IF, mais pas de ELSE, je te laisse faire ;)

 
Par ouinouin  -  Le 16/06/2013 17:13  -  Haut de page  - 

purée je suis vraiment un boulet!!!

En tout cas encore un grand merci pour tout

 
Par Cyrano  -  Le 16/06/2013 17:15  -  Haut de page  - 

;)

 
Par ouinouin  -  Le 16/06/2013 17:23  -  Haut de page  - 

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 ....>

 
Par Cyrano  -  Le 16/06/2013 17:30  -  Haut de page  - 

Normal, tu mélanges HTML et PHP : tu as oublié un point important...

 
Par ouinouin  -  Le 16/06/2013 17:33  -  Haut de page  - 

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

 
Par Cyrano  -  Le 16/06/2013 17:35  -  Haut de page  - 

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
 
Par ouinouin  -  Le 16/06/2013 17:39  -  Haut de page  - 

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
}
?>

 
Par Cyrano  -  Le 16/06/2013 17:39  -  Haut de page  - 

C'est ça

 
Par ouinouin  -  Le 16/06/2013 17:41  -  Haut de page  - 

ben non, il affiche plus rien du tout

 
Par Cyrano  -  Le 16/06/2013 17:43  -  Haut de page  - 

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']

 
Par ouinouin  -  Le 16/06/2013 17:46  -  Haut de page  - 

il affiche une fois le questionnaire et puis, plus rien

 
Par Cyrano  -  Le 16/06/2013 17:48  -  Haut de page  - 

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  
    }  
    ?>
 
Par ouinouin  -  Le 16/06/2013 20:26  -  Haut de page  - 

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 ...

 
Par Cyrano  -  Le 16/06/2013 20:30  -  Haut de page  - 

Ç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.

 
Par ouinouin  -  Le 16/06/2013 21:34  -  Haut de page  - 

merci une accolade oubliée, ca marche nikel, encore merci.

 

Ajouter une réponse à la discussion

Seuls les membres connectés sont autorisés à poster dans les forums !

Identifiez-vous
Join |  ID/MDP? |