Aller au contenu

Change
Photo

Calcul de l'IMC en PHP.


  • Veuillez vous connecter pour répondre
46 réponses à ce sujet

#1
Fitfit

Fitfit

    Geek certifié

  • Membre
  • 1 558 messages
  • Localisation<°(((((><
Salut à tous ! :slt:

Je vous expose mon problème : mon professeur d'informatique m'a demandé de réaliser un système de calcul de l'IMC.

Il doit se composer d'un formulaire qui demande le prénom, la taille et le poids.
Ensuite, tout doit s'afficher proprement sous forme de tableau.

On m'a filé Dreamweaver 8 et Wamp ( qui sont installés ), et à partir de là je dois me démerder ... :pff:

J'ai donc appris le php par mes moyens grâce aux informations trouvées sur le net, et surtout grâce au site du zero.

Pour l'instant, je dispose d'un fichier imc.php qui contient le code suivant :

<html>
    <head><title>Devoir IMC</title></head>
    <body>
        <h1>Système de détermination de l'IMC et de la corpulence</h1>
        <h2>Entrez les données suivantes :</h2>
        <form name="formulaire" method="post" action="imc.php">
            Entrez votre prénom : <input type="text" name="prenom"/> <br/>
            Entrez votre taille (sous la forme 1.70) : <input type="text" name="taille"/> <br/>
            Entrez votre poids (en kilos) : <input type="text" name="poids"/> <br/>
            <input type="submit" name="valider" value="OK"/>
        </form>
        <?php
        if(isset($_POST['valider'])){
            $prenom=$_POST['prenom'];
            $taille=$_POST['taille'];
            $poids=$_POST['poids'];
                    
            $imc=$poids/($taille*$taille);
                    
            echo 'Bonjour '.$prenom.'<br/>
            Votre IMC (indice de masse corporelle) est exactement : '.$imc.'<br/>';
                    
            if ($imc<16.5){
                $verdict='Vous êtes en dénutrition.';
            }
            elseif ($imc<18.5){
                $verdict='Vous êtes maigre.';
            }
            elseif ($imc<25){
                $verdict='Vous avez une corpulence normale.';
            }
            elseif ($imc<30){
                $verdict='Vous êtes en surpoids.';
            }
            elseif ($imc<35){
                $verdict='Vous êtes en état d\'obésité modérée.';
            }
            elseif ($imc<40){
                $verdict='Vous êtes en état d\'obésité sévère.';
            }
            else{
                $verdict='Vous êtes en état d\'obésité massive.';
            }
                        
            echo $verdict;
        }
        ?>
    </body>
</html>
Et après, je dois faire quoi ? Et comment voir si le code fonctionne ? :/
  • 0

1353655852-userbar-p4g.jpg
G73JH-A1 150W [1er modèle]
Intel Core i7 720QM - 8GB DDR3 1333MHz RAM - ATI Mobility™ Radeon HD 5870, 1GB GDDR5 VRAM -  Ecran 17.3" AUO B173HW01 V.5 Full LED Backlit - 2x500GB Seagate Momentus™ 7200rpm - Lecteur Blu-ray


#2
Dagda-Esus

Dagda-Esus

    Mac en force

  • Membre
  • 4 219 messages
bah tu lances ton fichier avec un serveur lamp/wamp/mamp (donc tu le met dans le répertoir où le serveur va voir (sur mac : /Application/MAMP/httpdocs/ sous linux c'est /var/www il me semble, windows je ne sais plus)

ensuite ton fichier marche bien, mais perso j'aurai fait different

Genre :
<html>
    <head><title>Devoir IMC</title></head>
    <body>
        <h1>Système de détermination de l'IMC et de la corpulence</h1>
        <?php if(!isset($_POST['valider'])){ ?>
        <h2>Entrez les données suivantes :</h2>
        <form name="formulaire" method="post" action="imc.php">
            Entrez votre prénom : <input type="text" name="prenom"/> <br/>
            Entrez votre taille (sous la forme 1.70) : <input type="text" name="taille"/> <br/>
            Entrez votre poids (en kilos) : <input type="text" name="poids"/> <br/>
            <input type="submit" name="valider" value="OK"/>
        </form>
        <?php
        }else{
            $prenom=$_POST['prenom'];
            $taille=$_POST['taille'];
            $poids=$_POST['poids'];
                    
            $imc=$poids/($taille*$taille);
                    
            echo 'Bonjour '.$prenom.'<br/>
            Votre IMC (indice de masse corporelle) est exactement : '.$imc.'<br/>';
                    
            if ($imc<16.5){
                $verdict='Vous êtes en dénutrition.';
            }
            elseif ($imc<18.5){
                $verdict='Vous êtes maigre.';
            }
            elseif ($imc<25){
                $verdict='Vous avez une corpulence normale.';
            }
            elseif ($imc<30){
                $verdict='Vous êtes en surpoids.';
            }
            elseif ($imc<35){
                $verdict='Vous êtes en état d\'obésité modérée.';
            }
            elseif ($imc<40){
                $verdict='Vous êtes en état d\'obésité sévère.';
            }
            else{
                $verdict='Vous êtes en état d\'obésité massive.';
            }
                        
            echo $verdict;
        }
        ?>
    </body>
</html>
je cache donc le formulaire si $_POST existe pour afficher le résultat (tu peux ne pas être d'accords avec ce fonctionnement)
ensuite moi je testerai les entrées utilisateurs (même si là c'est qu'un simple calcul, ne jamais croire l'utilisateur !) donc :
if(!empty($_POST['prenom'])){
$prenom=$_POST['prenom'];
}else{
echo 'vous n'avez pas rentré de prénom';
}
pour les "chiffres" j'aurai demander une taille en centimètre et pas en mètre (histoire d'avoir un entier ^^)

dans les deux cas ce code devrai marché (forme 1.XX ou 1,XX je ne sais pas)
if(is_numeric($_POST['taille'])){
    $taille=$_POST['taille'];
}
D'après moi c'est le programmeur qui doit prévoir tout les cas pour l'utilisateur... et pas à l'utilisateur de s'adapter a un programme mal fait :
if(is_numeric($_POST['taille'])){
    if(stripos($_POST['taille'], '.')||stripos($_POST['taille'], ',')){
        $taille=$_POST['taille'];
    }else{
        $taille=$_POST['taille']/100;
    }
}
Donc là on test si la taille est en mètre (avec virgule ou point) ou en centimètre et en centimètre, on convertit en mètre :P

pour le poids, un "is_numeric" en test serai pas mal aussi

Pour le prénom, on peu éviter tout les caractères qui feraient *où sont les toilettes ? Viiiite !* avec un "htmlspecialchars()"

de plus, j'aurai séparer le form et l'affichage du résultat dans des fichiers différant (histoire de s'entrainer un peu, et comme ça si l'application prend en ampleur, tu gardes un code bien séparer :P

voila je t'ai donner des conseils et des "bonnes pratique" et quelques truks à adapté toi même, de quoi t'amuser :)
  • 0
configuration actuel : Macbook Pro 15" 2011 > sandy bridge@2,0gHz > 8go DDR3 > OWC extrem 6G 120go > OBHD : 500go@5400tr/min

#3
Dagda-Esus

Dagda-Esus

    Mac en force

  • Membre
  • 4 219 messages
Bon finalement je me suis amuser un peu avec ton code pendant 30petites minutes xD
Alors premier point, tu avait oublier de précisez l'encodage dans le head je l'ai rajouter avant le titre.
Deuxième point, j'ai utiliser le bootstrap tweeter, un moyen très simple de rendre la page plus jolie (par contre la nouvelle version met 3plombes à charger chez moi, faudrait l'avoir en local ;))

après tu remarqueras l'utilisation de html5/css3 pour me la pèter aussi (faut que tu apprennes à utiliser les nouveautés aussi ^^)
alors pour le css, utilisation de des ombres porté(=box-shadow), utilisation des nouveauté pour définir des couleurs différentes en fonction de l'état du formulaire (:invalide, :valid, :focus) et pour exclure une classe (le bouton submit qui était toujours valid et qui avait une ombre sous chrome)

ensuite en html normal, tu avait oublier les labels, c'est plus propre ainsi !
j'ai modifier les input pour les rendre conforme html5 (on faire pas les balises style input, br, img,... qui n'ont pas deux parties), j'ai mis un place holder (texte qui s'affiche quand le champs est vide), j'ai définit le type de la taille et du poid en temps que nombre avec un "pas" en centième pour la taille (on veux des mètres)
Faut garder à l'esprit que les vérifications de formulaire coté client, c'est pas sécurisé du tout, mais c'est userfriendly (donc il n'y aura que les hackeurs qui verront les messages renvoyer par le serveur php en théorie), donc on garde les vérifications en php aussi ;)

Donc la correction des tests php aussi, mais que tu ne pourras pas tester avec un navigateur récent puisqu'ils interprèteront le html5 ^^


<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
        <title>Devoir IMC</title>
        <link rel="stylesheet" href="http://twitter.github.com/bootstrap/assets/css/bootstrap.css">
        <link rel="stylesheet" href="http://twitter.github.com/bootstrap/assets/css/bootstrap-responsive.css">
        <link rel="stylesheet" href="http://twitter.github.com/bootstrap/assets/css/docs.css">
        <style>
            label{
                display: inline;
            }
            input{
                height: 28px;
            }
            input:invalid{
                border-color: #953b39;
                -webkit-box-shadow: 0 0 6px #d59392;
                -moz-box-shadow: 0 0 6px #d59392;
                box-shadow: 0 0 6px #d59392;
            }
            input:valid:not(.btn){
                border-color: #356635;
                -webkit-box-shadow: 0 0 6px #7aba7b;
                -moz-box-shadow: 0 0 6px #7aba7b;
                box-shadow: 0 0 6px #7aba7b;
            }
            input:focus, textarea:focus {
                border-color: rgba(82, 168, 236, 0.8);
                -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
                -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
                box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
                outline: 0;
                outline: thin dotted \9;
                /* IE6-8 */
            }
        </style>
    </head>
    <body>
        <h1>Système de détermination de l'IMC et de la corpulence</h1>

<?php if(!isset($_POST['valider'])){ ?>

        <h2>Entrez les données suivantes :</h2>
        <form name="formulaire" method="post" action="imc.php">
            <label for="prenom">Entrez votre prénom : </label><input type="text" name="prenom" placeholder="Prénom" required> <br>
            <label for="taille">Entrez votre taille (sous la forme 1.70) : </label><input type="number" name="taille" step="0.01" placeholder="Taille (m)" required> <br>
            <label for="poids">Entrez votre poids (en kilos) : </label><input type="number" name="poids" placeholder="Poid (kg)" required/> <br>
            <input type="submit" name="valider" class="btn success" value="OK">
        </form>

<?php
        }else{
            $prenom=$_POST['prenom'];
            if(is_numeric($_POST['taille'])){
                if(stripos($_POST['taille'], '.')||stripos($_POST['taille'], ',')){
                    $taille=$_POST['taille'];
                }else{
                    $taille=$_POST['taille']*100;
                }
            }else{
                echo 'mauvaise taille';
            }
            if(is_numeric($_POST['poids'])){
                $poids=$_POST['poids'];
            }
                    
            $imc=$poids/($taille*$taille);
                    
            echo 'Bonjour '.$prenom.'<br/>
            Votre IMC (indice de masse corporelle) est exactement : '.$imc.'<br/>';
                    
            if ($imc<16.5){
                $verdict='Vous êtes en dénutrition.';
            }
            elseif ($imc<18.5){
                $verdict='Vous êtes maigre.';
            }
            elseif ($imc<25){
                $verdict='Vous avez une corpulence normale.';
            }
            elseif ($imc<30){
                $verdict='Vous êtes en surpoids.';
            }
            elseif ($imc<35){
                $verdict='Vous êtes en état d\'obésité modérée.';
            }
            elseif ($imc<40){
                $verdict='Vous êtes en état d\'obésité sévère.';
            }
            else{
                $verdict='Vous êtes en état d\'obésité massive.';
            }
                        
            echo $verdict;
        }
        ?>
    </body>
</html>

  • 0
configuration actuel : Macbook Pro 15" 2011 > sandy bridge@2,0gHz > 8go DDR3 > OWC extrem 6G 120go > OBHD : 500go@5400tr/min

#4
Fitfit

Fitfit

    Geek certifié

  • Membre
  • 1 558 messages
  • Localisation<°(((((><
Salut, déjà merci pour ton aide et tes conseils !
Je n'ai pas encore eu le temps de me pencher la dessus depuis mon post. Je testerai tout ça tout à l'heure et je te dis quoi ;)

Modifié par Fitfit, 05 février 2012 - 01:26.

  • 0

1353655852-userbar-p4g.jpg
G73JH-A1 150W [1er modèle]
Intel Core i7 720QM - 8GB DDR3 1333MHz RAM - ATI Mobility™ Radeon HD 5870, 1GB GDDR5 VRAM -  Ecran 17.3" AUO B173HW01 V.5 Full LED Backlit - 2x500GB Seagate Momentus™ 7200rpm - Lecteur Blu-ray


#5
Dagda-Esus

Dagda-Esus

    Mac en force

  • Membre
  • 4 219 messages
Par contre pour le rendu, ne met pas le bootstrap tweeter et le html5, si c'est pas quelque chose vu en cours, le proff va penser à la tricherie à cause de ça :P

De même comprend bien qu'il faut toujours tout vérifier et maitriser les tests conditionnels ^^
PHP propose des fonctions simplifiant les tests genre pour les prénoms ma première idée était de tester avec une regex, alors qu'un htmlspecialchars évitera l'injection de code même s'il n'offre pas la souplesse d'une regex, il serai suffisant.

Pour les nombres, je vérifis que c'est bien des nombres, et en html5, j'utilise des fonctions pour forcé l'utilisateur à envoyer les données sous la bonne forme, mais faut toujours faire une deuxième vérification côté serveur.

Je me répète, mais voila la sécurité c'est primordial, c'est tellement simple de laisser des failles... (le deuxième point important est de fournir un code W3C compliant ^^)
  • 0
configuration actuel : Macbook Pro 15" 2011 > sandy bridge@2,0gHz > 8go DDR3 > OWC extrem 6G 120go > OBHD : 500go@5400tr/min

#6
toto63

toto63

    Geek diplomé

  • Membre
  • 2 874 messages
Bonjour,
:lol: le site du zéro, la bible pour un programmer les exos d'école. C'était la même chose pour moi en C++ comme la prof n'aidait guère. Mon dernier programme en C++ était une gestion d'outils à partir de fichiers, 10 h 30 de boulot pou arriver à un truc fonctionnel. Ce qui me fait bien rire, tu as ton fichier programme avec les questions, un collègue te recopie intégralement une question, toi cela marche, le collègue, cela veut jamais marcher (même en Ctrl+c, ctrl+v).
Bon courage.
  • 0

Desktop : HP Omen 870-025 nf, GTX 1080, i5 6400
Calcul distribué avec BOINC : 210 000 000 PTS (GPU GRID, World Community Grid)


#7
Fitfit

Fitfit

    Geek certifié

  • Membre
  • 1 558 messages
  • Localisation<°(((((><
Salut ! Merci toto63 pour tes encouragements ;)

En fait, en cours on a rien vu du tout, c'était par le biais de formations en ligne (juste l'HTML et le CSS). On a juste eu des cours de C ...

Je ne sais pas me servir de Dreamweaver et Wamp. Je ne sais donc pas comment tester mes fichiers. J'ai placé mon "imc.php" dans le dossier "www"
EDIT : J'ai trouvé pour tester les fichiers; localhost puis choix du fichier :D

Je vais bosser sur l'affichage et sur le test des variables et tout ça, comme tu me l'a conseillé !

EDIT : Apparemment j'ai un petit problème d'encodage ? [Résolu avec Notepad]

Aussi, en testant ton code, j'ai remarqué que seuls les résultats étaient affichés après avoir envoyé le données. ( Le formulaire n'est plus là, ce qui pousse l'utilisateur à cliquer sur précédent. Y aurait-il un moyen de créer un bouton "retour" ? Dans le genre qui renvoie à la page imc.php initiale ( vide de données, donc sans les informations dans les cases ) ?

Modifié par Fitfit, 05 février 2012 - 19:52.

  • 0

1353655852-userbar-p4g.jpg
G73JH-A1 150W [1er modèle]
Intel Core i7 720QM - 8GB DDR3 1333MHz RAM - ATI Mobility™ Radeon HD 5870, 1GB GDDR5 VRAM -  Ecran 17.3" AUO B173HW01 V.5 Full LED Backlit - 2x500GB Seagate Momentus™ 7200rpm - Lecteur Blu-ray


#8
Dagda-Esus

Dagda-Esus

    Mac en force

  • Membre
  • 4 219 messages
pour le problème d'encodage, c'est dans ton éditeur de code, il faut que tu convertisse le fichier en UTF-8 qui est la norme utiliser maintenant ^^

pour le bouton précédant, il faut simplement mettre un lien vers la même page, comme tu n'enverra pas de données en POST, le <?php if(!isset($_POST['valider'])){ ?> sera faux donc vrai et affichera donc le formulaire

dans ton cas : <a href="imc.php" classe="btn">Précédant</a> (la classe pour garder le même style graphique pour tout les boutons ^^)
  • 0
configuration actuel : Macbook Pro 15" 2011 > sandy bridge@2,0gHz > 8go DDR3 > OWC extrem 6G 120go > OBHD : 500go@5400tr/min

#9
Fitfit

Fitfit

    Geek certifié

  • Membre
  • 1 558 messages
  • Localisation<°(((((><
Merci pour ton aide ! Je me demandais s'il y avait moyen de mettre une image de fond, sans utiliser de CSS, avec CSS 3 ? Tu n'aurais pas un pitit lien pour que je me mette un peu à jour ? ( par exemple un lien qui explique le kit que tu as mis dans ton code ) ;)

EDIT : Pour l'image de fond, c'est fait. Sinon pour le bouton "Précédent", je dois le mettre ou au niveau de mon code ? Il fonctionne, mais n'est pas "stylisé". Il est présent aussi avant l'envoi des informations, ce que je ne veut pas.

Aussi, quand j'utilise une virgule au lieu du point au poids et à la taille, j'obtiens des erreurs.

Voici mon code actuel :
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
        <title>Devoir - Calcul de l'IMC</title>
        <link rel="stylesheet" href="http://twitter.github.com/bootstrap/assets/css/bootstrap.css">
        <link rel="stylesheet" href="http://twitter.github.com/bootstrap/assets/css/bootstrap-responsive.css">
        <link rel="stylesheet" href="http://twitter.github.com/bootstrap/assets/css/docs.css">
        <style> <!-- embellissement avec CSS 3 -->
            label{
                display: inline;
            }
            input{
                height: 28px;
            }
            input:invalid{
                border-color: #953b39;
                -webkit-box-shadow: 0 0 6px #d59392;
                -moz-box-shadow: 0 0 6px #d59392;
                box-shadow: 0 0 6px #d59392;
            }
            input:valid:not(.btn){
                border-color: #356635;
                -webkit-box-shadow: 0 0 6px #7aba7b;
                -moz-box-shadow: 0 0 6px #7aba7b;
                box-shadow: 0 0 6px #7aba7b;
            }
            input:focus, textarea:focus {
                border-color: rgba(82, 168, 236, 0.8);
                -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
                -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
                box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
                outline: 0;
                outline: thin dotted \9;
            }
            
            body {
                background-image: url(images/bg.jpg);
                background-repeat: repeat;
            }
            
        </style>
    </head>
    <body>
        <center>
        <h1><u>Système de détermination de la corpulence</h1>

<?php if(!isset($_POST['valider'])){ ?>

        <h2>Veuillez entrer les données suivantes :</u></h2><br>
        <form name="formulaire" method="post" action="imc.php">
            <label for="prenom">Entrez votre prénom : </label><input type="text" name="prenom" placeholder="Prénom (facultatif)" required> <br>
            <label for="taille">Entrez votre taille : </label><input type="number" name="taille" step="0.01" placeholder="Taille (mètres)" required> <br>
            <label for="poids">Entrez votre poids : </label><input type="number" name="poids" placeholder="Poids (kg)" required/> <br>
            <input type="submit" name="valider" class="btn success" value="OK">
        </form>

<?php
        }else{
            $prenom=$_POST['prenom'];
            if(is_numeric($_POST['taille'])){
                if(stripos($_POST['taille'], '.')||stripos($_POST['taille'], ',')){
                    $taille=$_POST['taille'];
                }
                else{
                    $taille=$_POST['taille']*100;
                }
            }else{
                echo 'mauvaise taille';
            }
            if(is_numeric($_POST['poids'])){
                $poids=$_POST['poids'];
            }
                    
            $imc=$poids/($taille*$taille);
                    
            echo 'Bonjour '.$prenom.'<br/>
            Votre indice de masse corporelle est de : '.$imc.'<br/>';
                    
            if ($imc<16.5){
                $verdict='Vous êtes en dénutrition.';
            }
            elseif ($imc<18.5){
                $verdict='Vous êtes maigre.';
            }
            elseif ($imc<25){
                $verdict='Vous avez une corpulence normale.';
            }
            elseif ($imc<30){
                $verdict='Vous êtes en surpoids.';
            }
            elseif ($imc<35){
                $verdict='Vous êtes en état d\'obésité modérée.';
            }
            elseif ($imc<40){
                $verdict='Vous êtes en état d\'obésité sévère.';
            }
            else{
                $verdict='Vous êtes en état d\'obésité massive.';
            }
            
            echo $verdict;
        }
        ?>
        <a href="imc.php" classe="btn">Précédent</a>
        </center>
    </body>
</html>
(L'image de fond ne va pas s'afficher étant donné qu'elle est dans un dossier)

Modifié par Fitfit, 05 février 2012 - 21:23.

  • 0

1353655852-userbar-p4g.jpg
G73JH-A1 150W [1er modèle]
Intel Core i7 720QM - 8GB DDR3 1333MHz RAM - ATI Mobility™ Radeon HD 5870, 1GB GDDR5 VRAM -  Ecran 17.3" AUO B173HW01 V.5 Full LED Backlit - 2x500GB Seagate Momentus™ 7200rpm - Lecteur Blu-ray


#10
Dagda-Esus

Dagda-Esus

    Mac en force

  • Membre
  • 4 219 messages
pour le bootstrap twitter : http://twitter.github.com/bootstrap/
Pour le code du bouton que je t'ai passer, met le n'importe où dans ton code hors Php, mais le mieux c'est de le mettre en bas de page donc à la fin du html, mais avant la fermeture du else php (pour évité qu'il s'affiche à l'affichage du form) donc juste après :
echo $verdict;
pour l'image de fond, tu peux utilisé background-image (ou background) en css sur le body, le css3 ne change rien pour ça :P
  • 0
configuration actuel : Macbook Pro 15" 2011 > sandy bridge@2,0gHz > 8go DDR3 > OWC extrem 6G 120go > OBHD : 500go@5400tr/min

#11
Fitfit

Fitfit

    Geek certifié

  • Membre
  • 1 558 messages
  • Localisation<°(((((><
Merci pour le lien !
Mon background fonctionne, y'a pas de soucis.

Mes problèmes actuels sur lesquels je travaille sont :

- Le bouton "Précédent" n'a pas l'apparence du bouton "Valider".

- Les virgules qui ne sont pas acceptées pour la taille et le poids.
[h=#FFFF99]$_POST['taille'] = preg_replace("#,#", '.', $_POST['taille']);[/h]

- Quand une valeur non convenable est entrée ( par exemple "Bonjour" au lieu d'une taille correcte ), une erreur s'affiche quand même.

Et j'ai remarqué qu'il y avait une erreur dans ton code, dans la condition de taille :
if(is_numeric($_POST['taille'])){
                if(stripos($_POST['taille'], '.')||stripos($_POST['taille'], ',')){
                    $taille=$_POST['taille'];
                }else{
                    $taille=$_POST['taille']/100;
                }
Il faut faire /100 et non *100 ;)

Modifié par Fitfit, 05 février 2012 - 23:28.

  • 0

1353655852-userbar-p4g.jpg
G73JH-A1 150W [1er modèle]
Intel Core i7 720QM - 8GB DDR3 1333MHz RAM - ATI Mobility™ Radeon HD 5870, 1GB GDDR5 VRAM -  Ecran 17.3" AUO B173HW01 V.5 Full LED Backlit - 2x500GB Seagate Momentus™ 7200rpm - Lecteur Blu-ray


#12
Hypijump

Hypijump

    Newbie

  • Membre
  • 363 messages
Fait le en Js :D
  • 0
M17x R3 / i7 2630QM / ATI 6970 / 4go ram + 4go ram corsair VENDU
MacBook Pro 15" late 2011 8go ram (et du caca :D )

#13
Dagda-Esus

Dagda-Esus

    Mac en force

  • Membre
  • 4 219 messages
le bouton précédant à quelle apparence s'il a juste l'apparence d'un lien, c'est pas normal, s'il est juste pas de la même couleur, rajoute lui la class success

alors j'ai fait un petit "hack" sur la condition pour éviter d'écrire un message si le calcul à échouer
ensuite c'est "class" et pas "classe" dans le lien pour précédant...

j'avais pas mis de "else" pour le test de poids donc de message d'erreur
ensuite, j'ai changer ta gestion de l'affichage des résultats, on stock tout en variable puis on print à la fin (por faire suite à mon "hack", il vide la variable pour éviter d'afficher quelque chose s'il y a eu une erreur)

et je croit que c'est tout ce que j'ai changer :)
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
        <title>Devoir - Calcul de l'IMC</title>
        <link rel="stylesheet" href="http://twitter.github.com/bootstrap/assets/css/bootstrap.css">
        <link rel="stylesheet" href="http://twitter.github.com/bootstrap/assets/css/bootstrap-responsive.css">
        <link rel="stylesheet" href="http://twitter.github.com/bootstrap/assets/css/docs.css">
        <style> <!-- embellissement avec CSS 3 -->
            label{
                display: inline;
            }
            input{
                height: 28px;
            }
            input:invalid{
                border-color: #953b39;
                -webkit-box-shadow: 0 0 6px #d59392;
                -moz-box-shadow: 0 0 6px #d59392;
                box-shadow: 0 0 6px #d59392;
            }
            input:valid:not(.btn){
                border-color: #356635;
                -webkit-box-shadow: 0 0 6px #7aba7b;
                -moz-box-shadow: 0 0 6px #7aba7b;
                box-shadow: 0 0 6px #7aba7b;
            }
            input:focus, textarea:focus {
                border-color: rgba(82, 168, 236, 0.8);
                -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
                -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
                box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
                outline: 0;
                outline: thin dotted \9;
            }
            
            body {
                background-image: url(images/bg.jpg);
                background-repeat: repeat;
            }
            
        </style>
    </head>
    <body>
        <center>
        <h1><u>Système de détermination de la corpulence</h1>

<?php if(!isset($_POST['valider'])){ ?>

        <h2>Veuillez entrer les données suivantes :</u></h2><br>
        <form name="formulaire" method="post" action="imc.php">
            <label for="prenom">Entrez votre prénom : </label><input type="text" name="prenom" placeholder="Prénom (facultatif)" required> <br>
            <label for="taille">Entrez votre taille : </label><input type="number" name="taille" step="0.01" placeholder="Taille (mètres)" required> <br>
            <label for="poids">Entrez votre poids : </label><input type="number" name="poids" placeholder="Poids (kg)" required/> <br>
            <input type="submit" name="valider" class="btn success" value="OK">
        </form>

<?php
        }else{
            $prenom=$_POST['prenom'];
            if(is_numeric($_POST['taille'])){
                if(stripos($_POST['taille'], '.')||stripos($_POST['taille'], ',')){
                    $taille=$_POST['taille'];
                }
                else{
                    $taille=$_POST['taille']/100;
                }
            }else{
                echo 'mauvaise taille';
            }
            if(is_numeric($_POST['poids'])){
                $poids=$_POST['poids'];
            }
                    
            $imc=$poids/($taille*$taille);
            $verdict = 'Bonjour '.$prenom.'<br/>
            Votre indice de masse corporelle est de : '.$imc.'<br/>';
            if(empty($imc)){
                $verdict = '';
            }elseif ($imc<16.5){
                $verdict.='Vous êtes en dénutrition.';
            }
            elseif ($imc<18.5){
                $verdict.='Vous êtes maigre.';
            }
            elseif ($imc<25){
                $verdict.='Vous avez une corpulence normale.';
            }
            elseif ($imc<30){
                $verdict.='Vous êtes en surpoids.';
            }
            elseif ($imc<35){
                $verdict.='Vous êtes en état d\'obésité modérée.';
            }
            elseif ($imc<40){
                $verdict.='Vous êtes en état d\'obésité sévère.';
            }
            else{
                $verdict.='Vous êtes en état d\'obésité massive.';
            }
            
            echo $verdict.'<br/>';
            echo '<a href="imc.php" class="btn">Précédent</a>';
        }
        ?>
        </center>
    </body>
</html>

  • 0
configuration actuel : Macbook Pro 15" 2011 > sandy bridge@2,0gHz > 8go DDR3 > OWC extrem 6G 120go > OBHD : 500go@5400tr/min

#14
Fitfit

Fitfit

    Geek certifié

  • Membre
  • 1 558 messages
  • Localisation<°(((((><
@Hypijump : Je ne peux pas ;)

@Dagda-Esus : Pour le bouton c'est réglé ! En effet il y avait ce petit "e" qui merdait tout :D

J'ai réécrit tout mon code et tout fonctionne ! Je me pose juste deux questions :

- Y'a t'il un moyen de donner aux phrases de $Verdict un style bien précis ? Dans le genre italique et gras.
- Comment puis-je masquer les erreurs de wamp ? Ce quand une variable est incorrecte par exemple.

Modifié par Fitfit, 06 février 2012 - 00:59.

  • 0

1353655852-userbar-p4g.jpg
G73JH-A1 150W [1er modèle]
Intel Core i7 720QM - 8GB DDR3 1333MHz RAM - ATI Mobility™ Radeon HD 5870, 1GB GDDR5 VRAM -  Ecran 17.3" AUO B173HW01 V.5 Full LED Backlit - 2x500GB Seagate Momentus™ 7200rpm - Lecteur Blu-ray


#15
Arkh

Arkh

    Geek diplomé

  • Membre
  • 2 259 messages
[HS ON]

un collègue te recopie intégralement une question, toi cela marche, le collègue, cela veut jamais marcher (même en Ctrl+c, ctrl+v).

ca s'appelle une fuite memoire...

[HS OFF]
  • 0

D900F : I7 950 (8x3.1Ghz) /// 6GB DDR3 1333MHz (3x2Go) /// GTX 280M (128CC/1GHz/1Go) /// 2x320GB 7200Trs/min /// WUXGA Non-Glare Screen 1920x1200 /// Razer Abyssus /// NC-2000 /// By PcSystems-EvolutionX /// Powered by Debian!

> Get Process Explorer


#16
Dagda-Esus

Dagda-Esus

    Mac en force

  • Membre
  • 4 219 messages
moi ça s'affiche pas mais bon c'est une mauvaise gestion des erreurs là encore ^^
enfaite là il veux utiliser la variable "$poids" qui n'est pas définit pour un calcul... il n'y arrive pas donc te le dit :P

soit tu fais un test conditionnel à l'arrache autour du calcul de l'imc avec 1 condition par erreur (c'est moche, pas pratique et long ^^) soit tu définit une variable $erreur=0; en début de code, pour chaque erreur tu fais un "$erreur++;" (tu incrémentes la variable erreur) et donc autour du calcul tu mais un "if($erreur==0)" et là ça te permet de te passer de mon hack puisque le "if" pourrait encadrer tout les elseif... (et là j'ai la flemme de te faire le code mais avec ce qu'il y a entre guillemets, tu pourrais te débrouiller :))

ah oui et au dessus j'ai remonté le bouton "précédant" pour qu'il soit dans la condition, fallais le mettre dans un echo (tu remarqueras que quand je te donne des solutions, je ne te donne pas la solution complète et que tu doit réfléchir pour l'implémenter justement pour que tu apprennes :P)

Sinon pour les erreurs faudrait rajouter un "<br/>" en fin de ligne aussi... voir utiliser le bootstrap pour signaler que c'est des erreurs telque :
if(is_numeric($_POST['poids'])){
                $poids=$_POST['poids'];
            }else{
                echo '<span class="label label-important">mauvaise poids</span><br>';
                $erreur++;
            }

Modifié par Dagda-Esus, 06 février 2012 - 21:17.

  • 0
configuration actuel : Macbook Pro 15" 2011 > sandy bridge@2,0gHz > 8go DDR3 > OWC extrem 6G 120go > OBHD : 500go@5400tr/min

#17
Fitfit

Fitfit

    Geek certifié

  • Membre
  • 1 558 messages
  • Localisation<°(((((><
@Arkh Véridique :D

( Heureusement je suis pas du genre à copier ;) )

@Dagada-Esus

Mon code est fini en fait :cool:

Quand je parle d'erreur, je veut parler du grand rectangle provenant de Wamp je suppose !

Et sinon je me demandais si par le biais du CSS il y avait moyen d'attribuer un style au texte de $Verdict plutot que de mettre <b><i> Texte </i></b>

EDIT : Ce truc là ...

Image IPB

Modifié par Fitfit, 06 février 2012 - 01:17.

  • 0

1353655852-userbar-p4g.jpg
G73JH-A1 150W [1er modèle]
Intel Core i7 720QM - 8GB DDR3 1333MHz RAM - ATI Mobility™ Radeon HD 5870, 1GB GDDR5 VRAM -  Ecran 17.3" AUO B173HW01 V.5 Full LED Backlit - 2x500GB Seagate Momentus™ 7200rpm - Lecteur Blu-ray


#18
Dagda-Esus

Dagda-Esus

    Mac en force

  • Membre
  • 4 219 messages
oui, il te dit que la variable $poids utiliser dans le calcul n'est pas définit, donc faut sauter le calcul si tu as des "erreurs" dans les entrées utilisateur c'est ce que je t'expliquais

ensuite, non il n'y a pas de moyens d'écrire du html sans balises, il va falloir t'y faire :P
  • 0
configuration actuel : Macbook Pro 15" 2011 > sandy bridge@2,0gHz > 8go DDR3 > OWC extrem 6G 120go > OBHD : 500go@5400tr/min

#19
Patou

Patou

    Grand Geek

  • Membre
  • 827 messages
  • Localisation67
Pour éviter de répéter les <b> et les <i> et donc formater manuellement tout ton site tu peux définir un style pour les balises (par exemple <p>, <td>...) dans ton css et y coller le format souhaité. De cette facon il suffira de changer le contenu du css pour modifier l'aspect de tout ton site :D

Edit: Bon, si j'avais lu tout le post au lieu des 3 derniers commentaires j'aurais surement vu que le sujet avait été traité... :chant: -> Désolé

Modifié par Patou, 06 février 2012 - 12:56.

  • 0

Desktop - i7-4790k / GTX 970 / 16Go / 2x256Go SSD + 2To HDD / 24" 1920x1080 Led

Laptop - Asus Transformer Book T300LA-C4004H

Anciens - Alienware M14X r2 / Alienware M11X r2 / Clevo M571RU-U

 

Alien FX géré par les capteurs de votre pc: AlienFx Plus


#20
Fitfit

Fitfit

    Geek certifié

  • Membre
  • 1 558 messages
  • Localisation<°(((((><
@Patou : Merci quand même ;)

@Dagda : Tu as une idée de comment je peux "bypass" le calcul ? Un script dans la condition "else" ?
  • 0

1353655852-userbar-p4g.jpg
G73JH-A1 150W [1er modèle]
Intel Core i7 720QM - 8GB DDR3 1333MHz RAM - ATI Mobility™ Radeon HD 5870, 1GB GDDR5 VRAM -  Ecran 17.3" AUO B173HW01 V.5 Full LED Backlit - 2x500GB Seagate Momentus™ 7200rpm - Lecteur Blu-ray


#21
Dagda-Esus

Dagda-Esus

    Mac en force

  • Membre
  • 4 219 messages
bah je t'ai expliquer plus haut, tu fait une variable qui compte les erreurs, tu l'incrémentes à chaque erreur et tu un if($erreur==0){/*calcul de l'imc*/}

donc pour incrémenter une variable tu as la solution au post #16 de ce topic, il te reste juste à mettre un $erreur=0; avant la détection d'erreur... et pourquoi pas afficher le nombre d'erreurs ? ;)
  • 0
configuration actuel : Macbook Pro 15" 2011 > sandy bridge@2,0gHz > 8go DDR3 > OWC extrem 6G 120go > OBHD : 500go@5400tr/min

#22
Patou

Patou

    Grand Geek

  • Membre
  • 827 messages
  • Localisation67
lol, et au dela de 3 erreurs tu affiches "Je ne connais pas votre IMC, mais ce qui est sur, c'est que vous etes un boulet !!" :lol:
  • 0

Desktop - i7-4790k / GTX 970 / 16Go / 2x256Go SSD + 2To HDD / 24" 1920x1080 Led

Laptop - Asus Transformer Book T300LA-C4004H

Anciens - Alienware M14X r2 / Alienware M11X r2 / Clevo M571RU-U

 

Alien FX géré par les capteurs de votre pc: AlienFx Plus


#23
Yo Eight

Yo Eight

    Admin du Code

  • Membre
  • 4 218 messages
  • Localisationdans les environs de Paris
Comment comptez-vous tester l'exactitude de votre algo ? Votre code n'est pas unitestable et encore pire (vu que c'est une fonction mathématique), vous ne pouvez pas prouver que pour toute masse x, l'IMC vaut y. Il y a beaucoup trop d'effet de bord dans votre code => il n'est pas référentiel transparent. 2 appels consécutifs à votre code ne produiront pas le même résultat => VERY VERY BAD.

Y'a encore du travail à faire selon moi :)
  • 0
Mon blog: Deikonad - Functional Programming
iMac 27" : Core i7 860 @ 2,8 GHz - ATI 4850M - 8Go @ 1066MHz - 1To @ 7200trs/min
MacBook Pro 15" : Core i7 2635QM @ 2GHz - ATI 6490M - 8Go @ 1333MHz - 500Go @ 5400trs/min
MacBook Pro 13" : Core 2 Duo P8400 @ 2,26GHz - nVidia 9400M - 2Go @ 800MHz - 160Go @ 5400trs/min

#24
Fitfit

Fitfit

    Geek certifié

  • Membre
  • 1 558 messages
  • Localisation<°(((((><
@Dagda : Je n'avais pas vu, merci ! Je vais me pencher là dessus. ;)

@Yo Eight : Mon code final n'est pas affiché ici, mais je ne comprend pas votre point de vue. Que voulez-vous dire par "Votre code n'est pas uni-testable" ?

Je teste mon code en "localhost" via Wamp.

L'IMC se calcule selon une formule définie à savoir en unités métriques : IMC = Poids (kg) / (Taille (m) x Taille (m)).

Exemple 1 : Une personne dont la taille est de 1,70 m et le poids est de 60 kg a une IMC de

Calcul de l’IMC = 60 / (1.7 x 1.7) = 20.761 <== cette personne fait partie de la catégorie Normale.

Ensuite, comme vous le dites, deux appels consécutifs à mon code avec les mêmes données produiront le même résultat. Que la taille soit saisie en m ou cm, avec une virgule ou un point ne change rien avec mon code actuel. ;)

EDIT : @Patou : lol :vert:

@Dagda : J'ai du re-modifier mon code mais ça y est, "le rectangle d'erreur" n'est plus affiché ! :D

Je pense qu'il ne me reste plus rien à faire ! Donc voici ce que fait mon code :

- Calcul de l'IMC et affichage, avec 3 chiffres après la virgule.
- Détermination de la corpulence.
- Système de saisie en mètres ou centimètres, à virgule ou point.
- Système de saisie du poids en kilogrammes, à virgule ou point.
- Système d'erreur si la taille et/ou le poids saisis sont incorrects ( message à l'utilisateur, non affichage de l'erreur du calcul. )
- Système de calcul unique avec un bouton "Précédent" au niveau de la page du résultat.

Donc bah merci pour votre aide à tous, et particulièrement à Dagda-Esus :slt:

Modifié par Fitfit, 07 février 2012 - 21:11.

  • 0

1353655852-userbar-p4g.jpg
G73JH-A1 150W [1er modèle]
Intel Core i7 720QM - 8GB DDR3 1333MHz RAM - ATI Mobility™ Radeon HD 5870, 1GB GDDR5 VRAM -  Ecran 17.3" AUO B173HW01 V.5 Full LED Backlit - 2x500GB Seagate Momentus™ 7200rpm - Lecteur Blu-ray


#25
Yo Eight

Yo Eight

    Admin du Code

  • Membre
  • 4 218 messages
  • Localisationdans les environs de Paris
Tout d'abord, à part si cela te déranges, tu peux me tutoyer :)

Concernant ton code, je vais te fournir un conseil que j'applique au travail. Tout code qui n'est pas testable (correctement), je le "revert" direct du SCM (git, mercurial, svn,...). Une de ses règles consiste à appliquer ce qu'on appelle le Separation of Concern (SoC), à savoir une fonction/méthode == une responsabilité/fonctionnalité. Hors, ton code fait plusieurs choses:

1. Récuperation des données
2. Validation/Gestion des erreurs
3. Calcul de l'imc
4. Affichage du résultat

L'idée c'est donc d'avoir des fonctions différentes pour ces 4 fonctionnalités pour éviter des couplages que l'on risque de regretter plus tard, comme l'utilisation directe de variables globales (qui est à bannir !) via ton utilisation de $_POST dans ton code de calcul de l'IMC.

unit-testable pour test unitaire => Pouvoir tester sans contexte d'exécution (si possible, ou pouvoir facilement mettre en place un contexte)

Ta fonction de calcul doit-etre le plus pure (référentiel transparent) possible, en gros:

imc: (masse, taille) => (valeur) // une fonction prenant en paramètre une masse, une taille et retournant une valeur numérique, elle fait que ça, pas d'affichage, pas de gestion des erreurs.

Il en de même pour la validation et l'affichage du résultat. Comme cela, on peut tester, modifier une fonctionnalité sans impacter le reste.
  • 0
Mon blog: Deikonad - Functional Programming
iMac 27" : Core i7 860 @ 2,8 GHz - ATI 4850M - 8Go @ 1066MHz - 1To @ 7200trs/min
MacBook Pro 15" : Core i7 2635QM @ 2GHz - ATI 6490M - 8Go @ 1333MHz - 500Go @ 5400trs/min
MacBook Pro 13" : Core 2 Duo P8400 @ 2,26GHz - nVidia 9400M - 2Go @ 800MHz - 160Go @ 5400trs/min

#26
Fitfit

Fitfit

    Geek certifié

  • Membre
  • 1 558 messages
  • Localisation<°(((((><
Pour ce qui est de tutoyer, tu m'avais vouvoyé au début donc j'ai juste poursuivi ;)

J'aime bien ton idée de séparation ! Dagda m'en avait aussi parlé plus haut.
Il s'agit de ma première page PHP et comme expliqué au début, et je n'ai pas encore beaucoup de connaissances là dessus.

Pour ce travail, il est préférable que ça tienne sur une page, et je n'ai pas cherché à séparer quoi que ce soit.
Il est vrai que ça pourrait être intéressant sinon :)
  • 0

1353655852-userbar-p4g.jpg
G73JH-A1 150W [1er modèle]
Intel Core i7 720QM - 8GB DDR3 1333MHz RAM - ATI Mobility™ Radeon HD 5870, 1GB GDDR5 VRAM -  Ecran 17.3" AUO B173HW01 V.5 Full LED Backlit - 2x500GB Seagate Momentus™ 7200rpm - Lecteur Blu-ray


#27
Yo Eight

Yo Eight

    Admin du Code

  • Membre
  • 4 218 messages
  • Localisationdans les environs de Paris
Suis les recommandations de ton prof alors mais garde bien ces conseils en tête. Puis plus tard quand tu seras plus équipé en programmation, ne fait plus de PHP. Utilise un langage de programmation d'Homme :vert:
  • 0
Mon blog: Deikonad - Functional Programming
iMac 27" : Core i7 860 @ 2,8 GHz - ATI 4850M - 8Go @ 1066MHz - 1To @ 7200trs/min
MacBook Pro 15" : Core i7 2635QM @ 2GHz - ATI 6490M - 8Go @ 1333MHz - 500Go @ 5400trs/min
MacBook Pro 13" : Core 2 Duo P8400 @ 2,26GHz - nVidia 9400M - 2Go @ 800MHz - 160Go @ 5400trs/min

#28
Dagda-Esus

Dagda-Esus

    Mac en force

  • Membre
  • 4 219 messages
J'ai pas parler de ça comme ça, lui parle plutot de POO (tour sur le site du zéro) et de best practices...

moi je ne suis qu'un noob à coté de yo eight ^^

Par contre, je pense qu'il n'y a pas besoin de mettre tout ça en place pour un projet court et sans évolutions futur. c'est juste un projet en classe là apparement.

Mais oui la suite serait une séparation en fichiers distincts (pour un découpage plus facile, on a ici du php(erreurs/calcul/traitement du résultat), de l'html(form/affichage résultat), du css... :s), une gestion d'erreurs plus poussée, une mise en place d'ajax
  • 0
configuration actuel : Macbook Pro 15" 2011 > sandy bridge@2,0gHz > 8go DDR3 > OWC extrem 6G 120go > OBHD : 500go@5400tr/min

#29
Arkh

Arkh

    Geek diplomé

  • Membre
  • 2 259 messages

Utilise un langage de programmation d'Homme :vert:

:lol:

Tout simplement....
  • 0

D900F : I7 950 (8x3.1Ghz) /// 6GB DDR3 1333MHz (3x2Go) /// GTX 280M (128CC/1GHz/1Go) /// 2x320GB 7200Trs/min /// WUXGA Non-Glare Screen 1920x1200 /// Razer Abyssus /// NC-2000 /// By PcSystems-EvolutionX /// Powered by Debian!

> Get Process Explorer


#30
Fitfit

Fitfit

    Geek certifié

  • Membre
  • 1 558 messages
  • Localisation<°(((((><
Ok merci pour vos conseils :D

Sinon vous me proposez quoi comme langage de programmation d'homme ? :chant:
  • 0

1353655852-userbar-p4g.jpg
G73JH-A1 150W [1er modèle]
Intel Core i7 720QM - 8GB DDR3 1333MHz RAM - ATI Mobility™ Radeon HD 5870, 1GB GDDR5 VRAM -  Ecran 17.3" AUO B173HW01 V.5 Full LED Backlit - 2x500GB Seagate Momentus™ 7200rpm - Lecteur Blu-ray





0 utilisateur(s) li(sen)t ce sujet

0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)