[RESOLU] Problème exercice PHP

Petit nouveau ! | 3 Messages

27 janv. 2014, 17:41

Bonjour à tous,

Je suis un cursus de Chef de Projet Web, et j'ai des cours de PHP pour lequel j'ai un exercice à faire. Voici l'énoncé :
Le but de ce script est de proposer à l'utilisateur, sur une page Web, un formulaire minimaliste avec une zone de saisie et un bouton de soumission nommé "Envoi". Le texte affiché en regard de la zone de saisie est :
"Saisissez une valeur entre 0 et 10 : ".
Lorsque l'utilisateur tape un nombre et clique sur "Envoi", le script affiche 10 images de la petite led (ci-jointe), dont autant en mode "allumée" (rouge) que le nombre saisi. Et le reste en mode "éteint" (gris).
Bien entendu, vous vous arrangerez pour que si l'on tape un nombre supérieur à 0, il soit traité comme zéro, et supérieur à 10, ramené à 10.
Voila le problème : J'ai réussi à intégrer mon formulaire (en mode post) ainsi qu'à lier l'affichage des LEDS à cette valeur. Quand on tape un nombre supérieur à 10, pas de soucis, on voit bien 10 LEDS rouges affichées à l'écran. Mais quand on tape un nombre négatif, par exemple -5, on verra 15 LEDS grises. Je n'arrive pas à trouver l'erreur dans mon code qui fait buger le script.

Code : Tout sélectionner

print("Saisissez une valeur entre 0 et 10 "); print("<form action=\"charles_03.php\" method=\"post\"/>"); print("<input type=\"valeur\" name=\"valeurled\"/>"); print("<input type=\"submit\" value=\"Envoi\"/>"); print("</br>"); if(isset($_POST['valeurled'])){ $valeur=$_POST['valeurled']; for ($i=0;$i<$_POST['valeurled'];$i++) { echo '<img src="led_allumee.gif" />'; if ($_POST['valeurled']>10){$_POST['valeurled']=10;} } for ($i=$_POST['valeurled'];$i<0;$i++) { echo '<img src="led_eteinte.gif" />'; if ($_POST['valeurled']<0){$_POST['valeurled']=0;} } }
Merci de votre aide en tous cas 8-)

Eléphant du PHP | 56 Messages

27 janv. 2014, 18:01

C'est ton 2ème for qui pose problème selon moi :

for ($i=$_POST['valeurled'];$i<0;$i++)

A la fin du premier for, i vaudra 10 par exemple. Or, tu lui dis, Pour $i<10;$i<0

Je pense que le soucis vient de là.

@+

ViPHP
xTG
ViPHP | 7331 Messages

27 janv. 2014, 19:26

Ce genre de test :
if ($_POST['valeurled']<0){$_POST['valeurled']=0;}
est à faire en dehors des boucles sous peine de modification du comportement de la boucle. ;)

Ensuite tu initialises $valeur mais ne l'utilise jamais, ce serait plus propre d'utiliser cette variable plutôt que $_POST dans tes boucles.

Sinon ton code fonctionne et affiche bien 5 led éteintes. ;)

Petit nouveau ! | 3 Messages

28 janv. 2014, 13:08

Ce genre de test :
if ($_POST['valeurled']<0){$_POST['valeurled']=0;}
est à faire en dehors des boucles sous peine de modification du comportement de la boucle. ;)

Ensuite tu initialises $valeur mais ne l'utilise jamais, ce serait plus propre d'utiliser cette variable plutôt que $_POST dans tes boucles.

Sinon ton code fonctionne et affiche bien 5 led éteintes. ;)
Pour la position du if et l'utilisation de la variable, c'est ce que j'avais fais au départ. Mais j'ai modifié sur les instructions de mon prof. Donc bon, t'as surement pas tord, mais c'est lui qui me note :mrgreen:

Voila ce que moi j'ai à l'affichage
http://www.hostingpics.net/viewer.php?id=377368php.png

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

28 janv. 2014, 13:15

Donc bon, t'as surement pas tord, mais c'est lui qui me note
ce n'est pas parce qu'il est profs qu'il ne peu pas apprendre.
s'il fait de la merde, tu vas apprendre a faire de la merde et au final ben .....

Tu peux en parler avec lui et voir pourquoi il fait ça et voir ce qu'il peux dire sur le cas présents (il n'a pas peux être pas prévu ce cas).


@+
Il en faut peu pour être heureux ......

ViPHP
xTG
ViPHP | 7331 Messages

28 janv. 2014, 16:52

Je serai curieux d'avoir son explication oui...
Car pour moi on peut le tourner dans tous les sens c'est le chien qui se mort la queue un code de ce genre.
C'est inexcusable.
Quand on utilise une boucle for c'est qu'on connait à l'avance le nombre d'itération.
Si on modifie le nombre d'itération en cours de boucle c'est un while qu'il faut utiliser.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

28 janv. 2014, 17:30

j'ai oublier la solution tous à l'heure ...

c'est pas $i<0 mais $i< 10 qu'il faut mettre comme condition de sortie du second if

et virer le if qui pose problème.

explication :
on commence par afficher les allumées que l'on souhaite :
- boucle de zéro à la valeur souhaitée (exclue sinon il y aura une del en trop mais tu le sais déjà je pense).
A cette étape nous avons affichée x led
pour afficher ce qu'il manque c'est un problème de math simple
combien j'ai de led éteinte sachant qu'il y a 10 led en tous et que x sont allumées ?

===> 10-x led sont éteinte.
du coup
- soit tu fait le calcul (10 - x disons que c'est y) et tu fait un for qui va de zéro à y et à chaque tour de boucle tu affiche une led éteinte
- soit tu fait, comme actuellement, une boucle qui part du nombre de del allumées et qui va au nombre max de led

au final le seul if dont tu a besoin c'est pour savoir si le formulaire est posté.

tu peux virer cette ligne $valeur=$_POST['valeurled']; qui ne sert à rien.

je t'invite aussi à vérifier le type de champs qui est fournit pour éviter les ânerie (du genre que ce passe t'il si l'on saisie azerty dans le champ ?)
pour cela filter_var

pour info il est tous a fait possible de boucler sur des lettres plutot que des nombres.
exemple
<?php
for ($l = 'a'; $l<= 'z'; $l++) {
echo $l.'<br />';
}
Dernière chose :

pour la lisibilité du code tu peux largement virer les print qui affiche le formulaire ils sont totalement inutile (bon faut pas que cela soit dans un passage php quand même ;) ).

@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 2278 Messages

28 janv. 2014, 18:08

pour le début, suivre moogli, ce que je n'ai pas fait
Voici mon délire perso qui distingue vérifications, traitement et exploitation des valeurs
<?PHP
print("Saisissez une valeur entre 0 et 10 ");
//IL est inutile d'utiliser des doubles-quotes échappées
print("<form action = '' method='post'>");
//le type valeur n'existe pas Il faut une espace avant />
//required assure une saisie, mais pas sa qualité
print("<input type='text' required = required' name='valeurled' />");
print("<input type='submit' value='Envoi' />");
print("</br>");


/* Prétraitement*/
if ( isset($_POST['valeurled'])) //si la valeur a été renseignée
{
	$eclairees = intval($_POST['valeurled'], 10); //précaution supplémentaire contre les erreurs de saisie
	//$eclairees = $_POST['valeurled'];
	if ($eclairees < 0) // eclairees négatif
	{
		$eclairees = 0;
	}
	else //on aurait pu mettreun elseif
	{
		if ($eclairees > 10) //$eclairees excessif
		{
			$eclairees = 10;
		}
	}
}
else //formulaire non renseigné
{
	$eclairees= 0;
}
$eteintes = 10 - $eclairees;

/*Exploitation des résultats*/
for ($i = 1; $i <= $eclairees; $i++)
{
	echo '<img src="led_allumee.gif" alt = "allumee" />';
}
for ($i = 1; $i <= $eteintes; $i++)
{
	echo '<img src="led_eteinte.gif" alt = "eteinte" />';
}
?>
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Petit nouveau ! | 3 Messages

30 janv. 2014, 09:54

Ok, j'ai réussi à résoudre le problème. :mrgreen:

Enfaite, il suffisait de sortir mes fonctions if des boucles for, et les placer juste avant.

En tout cas, merci d'avoir pris de votre temps pour essayer et m'aider à résoudre ce petit bug. :mrgreen:

EDIT : Moogli, je comprend pas vraiment ton histoire de boucler sur des lettres, c'est quoi l'avantage ? Si tu peux m'en dire plus, ça m'interesse beaucoup :D