Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 08/03/2010, 16h20   #1
Membre actif
 
Inscription : avril 2008
Messages : 526
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 526
Points : 169
Points : 169
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 :
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 :
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;
}
stefsas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2010, 16h46   #2
Membre chevronné
 
Inscription : juin 2004
Messages : 726
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : juin 2004
Messages : 726
Points : 712
Points : 712
Bonjour,

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

Code :
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 :
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;
}
__________________
  • Mon blog PHP : http://blog.alterphp.com
  • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein

Dernière modification par pc.bertineau ; 09/03/2010 à 12h15.
pc.bertineau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2010, 17h40   #3
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 242
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 242
Points : 2 597
Points : 2 597
Code :
$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(...) ?
__________________
Win XP | WampServer 2.2 | Apache 2.2.21 | Php 5.3.8 | MySQL 5.5.16
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2010, 21h24   #4
Membre actif
 
Inscription : avril 2008
Messages : 526
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 526
Points : 169
Points : 169
Merci pour la réponse mais même si j'utilise cela comme code

Code :
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.
stefsas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2010, 08h19   #5
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 242
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 242
Points : 2 597
Points : 2 597
Citation:
... 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 :
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 :
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 :
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.
__________________
Win XP | WampServer 2.2 | Apache 2.2.21 | Php 5.3.8 | MySQL 5.5.16
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

Dernière modification par RunCodePhp ; 09/03/2010 à 08h49.
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2010, 12h13   #6
Membre chevronné
 
Inscription : juin 2004
Messages : 726
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : juin 2004
Messages : 726
Points : 712
Points : 712
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...

Citation:
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 :
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...
__________________
  • Mon blog PHP : http://blog.alterphp.com
  • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein
pc.bertineau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2010, 18h58   #7
Membre actif
 
Inscription : avril 2008
Messages : 526
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 526
Points : 169
Points : 169
Ok merci beaucoup pour les réponse.

Sinon, j'aurais voulu savoir si il y a un équivalent de intval pour les float ?
Merci.
stefsas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2010, 19h00   #8
Membre actif
 
Inscription : avril 2008
Messages : 526
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 526
Points : 169
Points : 169
Désolé c'est floatval evidemment.
stefsas est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 23h07.


 
 
 
 
Partenaires

Hébergement Web