IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Problème différenciation entre valeur null et zéro [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    526
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 526
    Par défaut Problème différenciation entre valeur null et zéro
    Bonjour ,

    J'ai une table note definie de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE TABLE note
    (
    IdEtudiant VARCHAR(20) NOT NULL,
    NomModule VARCHAR(20) NOT NULL,
    NomFormation VARCHAR(20) NOT NULL,
    DateFormation INT NOT NULL,
    NumSemestre VARCHAR(5) NOT NULL,
    PRIMARY KEY(IdEtudiant,NomModule,NomFormation,DateFormation,NumSemestre),
    FOREIGN KEY (IdEtudiant) REFERENCES etudiant(IdEtudiant),
    FOREIGN KEY (NomModule,NomFormation,DateFormation,NumSemestre) REFERENCES modules(NomModule,NomFormation,DateFormation,NumSemestre),
    NoteExam float NOT NULL,
    NoteTp float NOT NULL,
    moy float NOT NULL 
    );
    Ce que je fait avec mon programme, c'est que je veux calculer la moy du module.
    Ma formule est moy=(1/3) *NoteTp+(2/3)*NoteExam.
    Sachant que je ne suis pas obligé de rentrer une note de tp, je fais la distinction en différents cas.
    Mon pb est que mon programme n'arrive pas à faire la distinction entre un champ vide et une note égale à zéro.
    Si qq sait comment contourner le pb, merci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    $noteExam=parseInt($_POST['NOTEEXAMEN']);
    $noteTP=parseInt($_POST['NOTETP']);
     
    //Calcul de la moyenne du module
    if ($noteExam==0 && $noteTP==0)
    {
    $moyennne=0;
    }
     
    elseif (empty($noteTP))
    {
    	$moyennne=$noteExam;
    }
     
    elseif ($noteTP==0)                         //Pb à ce niveau là 
    {
    $moyennne=(2/3)*$noteExam;
    }
     
    elseif ($noteExam==0)
    {
    $moyennne=(1/3)*$noteTP;
    }
     
    else
    {
    	$moyennne=(2/3)*$noteExam+(1/3)*$noteTP;
    }

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Par défaut
    Bonjour,

    Premièrement tu définis trop de cas dans ton algo. Tu pourrais le simplifier comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $noteExam=parseInt($_POST['NOTEEXAMEN']);
    $noteTP=parseInt($_POST['NOTETP']);
     
    //Calcul de la moyenne du module
    if (!empty($noteExam) && !empty($noteTP))
    {
        $moyennne = (2/3)*$noteExam + (1/3)*$noteTP;
    } 
    else if (empty($noteTP))
    {
        $moyennne = $noteExam;
    }
    Mais tu auras toujours le même problème car tes valeurs nulles ne sont pas détectées... Ceci est sûrement dû à ta fonction parseInt qui doit retourner intval($var) comme je l'imagine (pourrait-on voir le code de cette fonction ?).

    Or, intval d'une chaîne vide renvoie 0... Donc ton cas où la chaîne serait vide est donc toujours "zappé"...

    d'où :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    //Calcul de la moyenne du module
    if (!empty($_POST['NOTEEXAMEN']) && !empty($_POST['NOTETP']))
    {
        $noteExam=parseInt($_POST['NOTEEXAMEN']);
        $noteTP=parseInt($_POST['NOTETP']);
    
        $moyennne = (2/3)*$noteExam + (1/3)*$noteTP;
    } 
    else if (empty($_POST['NOTETP']))
    {
        $noteExam=parseInt($_POST['NOTEEXAMEN']);
        $moyennne = $noteExam;
    }

  3. #3
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $noteExam=parseInt($_POST['NOTEEXAMEN']);
    parseInt() en php ?
    Il n'y aurait pas une ch'tite confusion avec du Javascript par hasard ?
    Ca ne serait pas plutôt intval(...) ?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    526
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 526
    Par défaut
    Merci pour la réponse mais même si j'utilise cela comme code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //Calcul de la moyenne du module
    if (!empty($_POST['NOTEEXAMEN']) && !empty($_POST['NOTETP']))
    {
        $noteExam=intval($_POST['NOTEEXAMEN']);
        $noteTP=intval($_POST['NOTETP']);
     
        $moyennne = (2/3)*$noteExam + (1/3)*$noteTP;
    } 
    else if (empty($_POST['NOTETP']))
    {
        $noteExam=intval($_POST['NOTEEXAMEN']);
        $moyennne = $noteExam;
    }
    cela ne règle pas mon problème, car si je veux rentrer un zéro comme note, il rentre dans la condition "else if (empty($_POST['NOTETP']))" et donc je n'obtiens pas le bon résultat.

  5. #5
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    ... si je veux rentrer un zéro comme note, il rentre dans la condition "else if (empty($_POST['NOTETP']))" et donc je n'obtiens pas le bon résultat.
    C'est normal, empty retourne VRAI pour toute valeur : null, vide, 0, et d'autre cas encore ...

    0 étant une exception, typer cette donnée dès le départ n'est pas la solution effectivement, car si c'est une chaine vide (donc normalement NULL) ça va la modifiée et obtenir 0.
    Impossible de faire faire le distingo entre 0 et NULL du coup.

    Un truc comme ceci peut être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if (!empty($_POST['NOTEEXAMEN']) && !empty($_POST['NOTETP'])) {
        // ... Note positive et NoteExamen positive ...
    }
    else if (is_numeric($_POST['NOTETP']) && $_POST['NOTETP'] == 0) {
    	// La note est : 0
    }
    else {
        // ... valeur NULL ...
    }

    Ou alors peut être, une déclinaison :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if (!empty($_POST['NOTEEXAMEN']) && !empty($_POST['NOTETP'])) {
        // ... Note positive et NoteExamen positive ...
    }
    else if (empty($_POST['NOTETP'])) {
    	if (is_numeric($_POST['NOTETP']) && $_POST['NOTETP'] == 0) {
    		// La Note vaut : 0
    	}
    	// ... etc ...
    }
    Mais encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (!empty($_POST['NOTEEXAMEN']) && (!empty($_POST['NOTETP']) || $_POST['NOTETP'] == 0)) {
        // ... Note positive OU 0 et NoteExamen positive ...
    }
    else if (empty($_POST['NOTETP'])) {
    	// ... etc ...
    }

    Ou alors peut être faudrait il avoir une autre approche, ça dépend des traitements, et calculs.
    Si par exemple une note a une valeur, que ce soit 0 ou une valeur positive ça débouche sur les mêmes calcul, alors vérifier si elle vaut 0 ne serait pas vraiment utile.
    Vérifier si elle vaut rien, nulle ou vide (mais pas 0) serait celle ci qui ferait l'objet d'une exception.

    Si les calculs diffèrent dans les 3 cas : null, vide et positif, alors il faudra faire 3 alternatives.
    Sinon, il y a peut être moyen d'en éliminer une, faut voir.

    Je n'ai pas suivi tes calculs, mais je pense que tu devrais le savoir.

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Par défaut
    Citation Envoyé par stefsas Voir le message
    cela ne règle pas mon problème, car si je veux rentrer un zéro comme note, il rentre dans la condition "else if (empty($_POST['NOTETP']))" et donc je n'obtiens pas le bon résultat.
    Au temps pour moi, la chaîne "0" est considérée comme vide...

    empty("0")
    L'évolution la plus polémique est celle de empty(). Une chaîne contenant seulement le caractère '0' (zéro) est maintenant considérée comme vide, alors qu'elle ne l'était pas en PHP 3.
    Il faut que tu traites les cas de chaînes à "0"...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    //Calcul de la moyenne du module
    if ( (!empty($_POST['NOTEEXAMEN']) && !empty($_POST['NOTETP']))
     || (!empty($_POST['NOTEEXAMEN']) && $_POST['NOTETP'] == "0")
     || ($_POST['NOTEEXAMEN'] == "0" && !empty($_POST['NOTETP']))
    )
    {
        $noteExam=intval($_POST['NOTEEXAMEN']);
        $noteTP=intval($_POST['NOTETP']);
     
        $moyennne = (2/3)*$noteExam + (1/3)*$noteTP;
    } 
    else if (empty($_POST['NOTETP']))
    {
        $noteExam=intval($_POST['NOTEEXAMEN']);
        $moyennne = $noteExam;
    }
    Il te reste à traiter le cas ou seul $_POST['NOTEEXAMEN'] est nul, et où les 2 sont nuls...

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    526
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 526
    Par défaut
    Ok merci beaucoup pour les réponse.

    Sinon, j'aurais voulu savoir si il y a un équivalent de intval pour les float ?
    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Problème différenciation entre valeur null et zéro
    Par stefsas dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 08/03/2010, 16h44
  2. [Toplink] Problème setParameter avec valeur null
    Par igloof dans le forum Persistance des données
    Réponses: 0
    Dernier message: 31/03/2009, 17h48
  3. Convertir une valeur Null en zéro
    Par belecom dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 08/05/2008, 15h37
  4. Remplacer une valeur <null> par zéro
    Par diablotin dans le forum SQL
    Réponses: 2
    Dernier message: 28/08/2007, 21h07
  5. Problème requette avec valeur NULL
    Par Destiny dans le forum Langage SQL
    Réponses: 3
    Dernier message: 21/05/2007, 08h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo