> Tous les forums > Forum des Webmasters
 Gestion des condition en phpSujet résolu
Ajouter un message à la discussion
Page : [1] 
Page 1 sur 1
laurent34
  Posté le 29/07/2012 @ 19:05 
Aller en bas de la page 
Astucien

,

j'ai un p'tit souci de compréhension d'un truc en php.

Je créé un mini-formulaire sans base de donnée où je demande à la personne si c'est un garçon ou une fille et son âge (si l'âge est <= à 12 ans --> ok).

La page formulaire contient ceci :

<p>Un message selon si c'est un garçon ou une fille et si l'âge est inférieur ou égal à 12 ans.</p>
<p>En tout il y aura 8 messages possibles car 2^3 possibilités.</p>

<form name="formulaire1" method="post" action="test06-resultats.php">

Tu es :
<select name="sexe">
<option value=""></option>
<option value="garçon">un garçon</option>
<option value="fille">une fille</option>
</select>
<br/>
Ton âge est : <input type="number" name="age"/>
<br/>
<input type="submit" value="Soumettre"/>
</form>

et le bouton submit envoie la requête vers cette page avec ce code :

<?php
$age = $_POST['age']; // récupération de la valeur de l'âge
$sexe = $_POST['sexe']; // récupération de la valeur "sexe" ("un garçon" ou "une fille") pour les tests
if ($age == NULL AND $sexe == NULL)//condition 1 : on connaît pas l'âge ni le sexe
{
echo 'Faut dire ton âge et si t\'es un garçon ou une fille !<br/>';
}
elseif ($age == NULL AND $sexe == "fille")//condition 2 : fille mais on connaît pas l'âge
{
echo 'Faut dire ton âge ma fille !<br/>';
}
elseif ($age == NULL AND $sexe == "garçon")//condition 3 : garçon mais on connaît pas l'âge
{
echo 'Faut dire ton âge mon garçon !<br/>';
}
elseif (isset($age) AND $sexe == NULL)//condition 4 : on connaît l'âge mais pas le sexe
{
echo 'Tu es quoi ? (garçon ou fille) !<br/>';
}
elseif ($age <= 12 AND $sexe == "garçon")//condition 5 : garçon de moins de 12 ans ou de 12 ans
{
echo 'Tu as moins de 12 ans mon garçon !<br/>';
echo 'Age : ' .$age .' ans. Genre : ' . $sexe .'.<br/>
-----------------------------------------------------<br/>';
}
elseif ($age <=12 AND $sexe == "fille")//condition 6 : fille de moins de 12 ans ou de 12 ans
{
echo 'Tu as moins de 12 ans fillette !<br/>';
echo 'Age : ' .$age .' ans. Genre : ' . $sexe .'.<br/>
-----------------------------------------------------<br/>';
}
elseif ($age > 12 AND $sexe == "garçon")//condition 7 : garçon de plus de 12 ans
{
echo 'T\'es trop vieux mon gars !<br/>';
echo 'Age : ' .$age .' ans. Genre : ' . $sexe .'.<br/>
-----------------------------------------------------<br/>';
}
elseif ($age > 12 AND $sexe == "fille")//condition 8 : fille de plus de 12 ans
{
echo 'T\'es pas assez jeune ma grande !<br/>';
echo 'Age : ' .$age .' ans. Genre : ' . $sexe .'.<br/>
-----------------------------------------------------<br/>';
}
?>

Tout fonctionne mais j'ai quelques questions (de base peut être) :

1) Y-a-t'il possibilité d'optimiser le code de la page "réponse" au questionnaire ou dois-je prendre en compte tous les cas possibles de cette manière (avec IF et une liste de ELSEIF) ?

2) J'ai attaqué le listing des conditions par les cas où il manque un renseignement --> un message "il faut indiquer un truc" apparaît.

Après plusieurs tests (et prises de tête), il semble qu'il faille toujours attaquer par ces cas-ci si on utilise les conditions IF et ELSEIF.

En intervertissant les différents cas, j'ai un peu des réponses aléatoires --> normal ou pas ?

3) Je n'arrive pas à intégrer deux sous-conditions dans le code de la page "résultat du questionnaire" : l'âge doit être donné en nombre ET être compris entre 5 et 100 par exemple.

Si une âme charitable pouvait me donner un coup de main...

EDIT : m'étais trompé en utilisant la méthode _GET au lieu de _POST plus sécurisée --> corrigé.



Modifié par laurent34 le 29/07/2012 22:36
Publicité
micron
 Posté le 30/07/2012 à 07:42 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Bonjour à toi laurent34,

Bon de mon coté, j'ai fais pas mal de modification que tu peux voir ci-dessous :

Index.html

<p>Un message selon si c'est un garon ou une fille et si l'âge est inférieur ou égal 12 ans.</p>

<p>En tout il y aura 8 messages possibles car 2^3 possibilités.</p>

<form name="formulaire1" method="post" action="test06-resultats.php">
<label>Tu es :</label>
<select name="sexe">
<option value=""></option>
<option value="garcon">un garçon</option>
<option value="fille">une fille</option>
</select>
<br/>
<label>Ton âge est : </label><input type="text" name="age"/><br/>
<input type="submit" value="Soumettre"/>
</form>

test06-resultats.php

<?php
$age = $_POST['age']; // rŽcupŽration de la valeur de l'‰ge
$sexe = $_POST['sexe']; // rŽcupŽration de la valeur "sexe" ("un garcon" ou "une fille") pour les tests

if(empty($age) && empty($sexe)){
echo 'Faut dire ton âge et si t\'es un garçon ou une fille !<br/>';
}
else if(empty($age) && isset($sexe)) {
echo 'Faut dire ton âge '.(($sexe == 'fille') ? "ma ".$sexe : "mon ".$sexe).' !<br/>';
}
else {
if(is_numeric($age)) {
if($age > 5 && $age < 100) {
if($sexe == "garcon") {
$sexe = "garçon";
}
if(isset($age) && empty($sexe)) {
echo 'Tu es quoi ? (garcon ou fille) !<br/>';
}
elseif ($age <=12 AND isset($sexe)) {
echo 'Tu as moins de 12 ans '.(($sexe == 'fille') ? "fillette" : "mon garçon").' !<br/>';
echo 'Age : ' .$age .' ans. Genre : ' . $sexe .'.<br/>
-----------------------------------------------------<br/>';
}
elseif ($age > 12 AND isset($sexe)) {
echo 'T\'es '.(($sexe == 'fille') ? "pas assez jeune ma grande" : "trop vieux mon gars").' !<br/>';
echo 'Age : ' .$age .' ans. Genre : ' . $sexe .'.<br/>
-----------------------------------------------------<br/>';
}
}
else {
echo "L'age doit être compris entre 5 et 100 !";
}
}
else {
echo "L'âge doit être numérique !";
}
}
?>

Sinon, je n'ai pas très bien compris quand tu dis

2) J'ai attaqué le listing des conditions par les cas où il manque un renseignement --> un message "il faut indiquer un truc" apparaît.

Après plusieurs tests (et prises de tête), il semble qu'il faille toujours attaquer par ces cas-ci si on utilise les conditions IF et ELSEIF.

En intervertissant les différents cas, j'ai un peu des réponses aléatoires --> normal ou pas ?

laurent34
 Posté le 30/07/2012 à 14:56 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

micron et merci pour ta réponse.

Je suis en train de la digérer (et de me l'annoter) mais elle me permet déjà de mieux comprendre certaines choses : je confonds entre cas et conditions en français...

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Pour en revenir à ta remarque, j'ai interverti des conditions dans mon jet de départ --> je n'ai pas eu la réponse attendue.

Genre : j'indique si c'est un garçon ou une fille mais pas l'âge. --> un des messages d'erreur mais pas forcément celui que j'attendais.

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Une question dont je crois connaître la réponse :

dans la valeur "garçon" du formulaire, tu l'as changée en "garcon" sans la cédille.

Tu l'appelles ensuite avec dans le cas où le choix "un garçon" est fait :

if($sexe == "garcon")
{
$sexe = "garçon";
}

C'est parce qu'il faut éviter les caractères spéciaux dans les variables envoyées par un formulaire ?



Modifié par laurent34 le 30/07/2012 15:29
micron
 Posté le 30/07/2012 à 15:46 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

laurent34 a écrit :

Une question dont je crois connaître la réponse :

dans la valeur "garçon" du formulaire, tu l'as changée en "garcon" sans la cédille.

Tu l'appelles ensuite avec dans le cas où le choix "un garçon" est fait :

if($sexe == "garcon")
{
$sexe = "garçon";
}

C'est parce qu'il faut éviter les caractères spéciaux dans les variables ?

En faites, j'évite de mettre des caractères spéciaux dans les values des selects (exemple : <option value="25%">), j'ai déjà pas mal de soucis en faisant ça.
Eviter ? ca aucune idée, mais moi je conseillerais d'en pas mettre uniquement dans les values des selects.

j'indique si c'est un garçon ou une fille mais pas l'âge. --> un des messages d'erreur mais pas forcément celui que j'attendais.

qu'est ce que tu veux dire ??

Aussi, le fait d'utiliser le POST par rapport à GET ne changera pas beaucoup de chose car avec tous les deux, un pirate peux toujours modifier les valeurs.

laurent34
 Posté le 30/07/2012 à 16:05 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Encore merci pour tes précisions.

micron a écrit :

j'indique si c'est un garçon ou une fille mais pas l'âge. --> un des messages d'erreur mais pas forcément celui que j'attendais.

qu'est ce que tu veux dire ??

J'avais au départ attaqué par "si rien n'est choisi" --> "il faut tout remplir" : le message apparaît pour ce cas.

Ensuite j'avais interverti la plupart de mes conditions (dans le désordre par rapport à ce que j'ai écris au début).

Et là, j'avais un peu du n'importe quoi. Je n'ai pas conservé cette page avec ces coquilles mais je prenais d'abord en compte l'âge avant les deux conditions sur la variable garçon/fille.

Ensuite merci pour cette écriture :

elseif ($age <=12 AND isset($sexe)) {
echo 'Tu as moins de 12 ans '.(($sexe == 'fille') ? "fillette" : "mon garçon").' !<br/>';

Je l'avais à peine entrevue (adapter une phrase selon une réponse avec deux possibilités au départ) et j'ai mieux pigé là.

-----------------------------------------------------------

En ce moment, je suis en train d'adapter ce que tu m'as passé comme écriture de code sur un affichage à partir d'une base de données.

micron
 Posté le 30/07/2012 à 18:53 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

ok je comprend mieux maintenant {#}

maintenant y a t il autre chose que tu désirais faire {#}

laurent34
 Posté le 30/07/2012 à 19:18 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Pour le moment non car j'ai réussi à l'adapter avec une base de données en local.

Je donne le code commenté : (si ça peut servir à d'autres)

$age = $_POST['age']; // récupération de la valeur de l'âge
$sexe = $_POST['sexe']; // récupération de la valeur "sexe" ("un garcon" ou "une fille") pour les tests
//CAS 1 : SI rien n'est choisi/rempli
if (empty($age) && empty($sexe))
{
echo 'Faut dire ton âge et si t\'es un garçon ou une fille !
';
}
//CAS 2 : OU SI il manque l'âge
elseif (empty($age) && isset($sexe))
{
echo 'Faut dire ton âge ' .(($sexe == 'fille') ? "ma " .$sexe : "mon garçon") .' !
';
}
//CAS 3 : tout est choisi/rempli mais...
//ALORS...
else
{
//CONDITION 1 : l'âge est écrit en nombre
if (is_numeric($age))
{
//SOUS-CONDITION 1 : SI l'âge est compris entre 5 et 100
if ($age > 5 && $age < 100)
{
// pour pouvoir écrire "garçon" avec la cédille, je donne une nouvelle valeur AVEC la cédille
if($sexe == "garcon")
{
$sexe = "garçon";
}
//l'âge vérifie la sous-condition 1 MAIS on sait pas si c'est un garçon ou une fille
if (isset($age) && empty($sexe))
{
echo 'Tu es quoi ? (garçon ou fille) !
';
}
//l'âge vérifie la sous-condition 1 ET a moins de 12 ans
elseif ($age {
echo 'Tu as moins de 12 ans '.(($sexe == 'fille') ? "fillette" : "mon garçon").' !
';
echo 'Age : ' .$age .' ans. Genre : ' . $sexe .'.

-----------------------------------------------------
';
}
//l'âge vérifie la sous-condition 1 ET a plus de 12 ans
elseif ($age > 12 AND isset($sexe))
{
echo 'T\'es '.(($sexe == 'fille') ? "pas assez jeune ma grande" : "trop vieux mon gars").' !
';
echo 'Age : ' .$age .' ans. Genre : ' . $sexe .'.

-----------------------------------------------------
';
}
}
//SI la SOUS-CONDITION 1 (SI l'âge est compris entre 5 et 100) n'est pas vérifiée --> on le signale
else
{
echo "L'age doit être compris entre 5 et 100 !";
}
}
//si la condition 1 ( l'âge est écrit en nombre) n'est pas vérifiée --> on a ce message
else
{
echo "L'âge doit être numérique !";
}
}
?>

En tout cas, merci beaucoup ! J'ai pu l'adapter avec deux demandes de renseignement de ce genre en liaison avec une base de données.

Je mets en résolu.

Mais je risque de revenir bientôt.



Modifié par laurent34 le 30/07/2012 21:19
micron
 Posté le 30/07/2012 à 22:29 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Mais de rien {#}

Ca m'a fait plaisir de t'avoir aider {#}

Ok de toute façon je suis toujours ici {#}

Page : [1] 
Page 1 sur 1

Vous devez être connecté pour participer à la discussion.
Cliquez ici pour vous identifier.

Vous n'avez pas de compte ? Créez-en un gratuitement !
Recevoir PC Astuces par e-mail


La Lettre quotidienne +226 000 inscrits
Avec l'actu, des logiciels, des applis, des astuces, des bons plans, ...

Les bonnes affaires
Une fois par semaine, un récap des meilleurs offres.

Les fonds d'écran
De jolies photos pour personnaliser votre bureau. Une fois par semaine.

Les nouveaux Bons Plans
Des notifications pour ne pas rater les bons plans publiés sur le site.

Les bons plans du moment PC Astuces

Tous les Bons Plans
144,40 €Tablette 10 pouces TECLAST P20HD (8 coeurs, FHD, 4 Go RAM, 64 Go) à 144,40 €
Valable jusqu'au 26 Mai

Amazon fait une vente flash sur la tablette 10 pouces TECLAST P20HD qui passe à 144,40 € livrée gratuitement au lieu de 169 €. Cette tablette possède un processeur octo core, 4 Go de RAM, 64Go de stockage extensibles par MicroSD, un écran FHD IPS (1920x1200) et tourne sous Android 10. Le WiFi, le bluetooth et le GPS sont également de la partie. Il possède même un emplacement SIM pour utiliser la 4G en mobilité.


> Voir l'offre
454,74 €Mini PC Beelink SER3 (Ryzen 7 3750H, 16 Go RAM, SSD 512Go) à 454,74 €
Valable jusqu'au 24 Mai

Geekbuying fait une promotion sur l'excellent mini PC Beelink SER3 qui passe à 454,74 € avec le code NNNDBFRBEELINKSER3. On le trouve habituellement autour de 599 €. Ce mini PC intègre un processeur AMD Ryzen 7 3750H (4 coeurs), 16 Go de RAM DDR4 et un SSD NVMe de 512 Go au format M.2 (un emplacement 2.5' libre est également disponible). Il possède un chip graphique RX Vega 10 qui fera tourner tous vos jeux. Il intègre le WiFi 5, le bluetooth 5.1, un port Ethernet Gigabit, 4 ports USB 3.0, un port USB-C et deux connecteurs HDMI. 

L'expédition se fait depuis un entrepôt en Allemagne et la TVA est comprise. Vous êtes ainsi certains d'être livré rapidement et de ne pas avoir de douane.

Une excellente affaire pour un PC très performant, silencieux et qui ne prendra pas de place ! 


> Voir l'offre
779,99 €Carte Graphique MSI Geforce RTX 3070TI Ventus 3X 8G LHR à 779,99 €
Valable jusqu'au 24 Mai

La baisse des cartes graphiques se poursuit doucement avec une bonne affaire chez Grosbill qui propose la MSI Geforce RTX 3070TI Ventus 3X 8G LHR à 779,99 € avec le code NVIDIA40 alors qu'on la trouve ailleurs à partir de 879,95 €.


> Voir l'offre

Sujets relatifs
gestion d'images
Gestion de bibliothèque ConnectedBooks
Logiciel complet gratuit création et gestion site
condition
Intégrer un WYSIWYG : interface de gestion contenu
création d'un logiciel de gestion d'alarmes
Problème de gestion de variables de session
Problème de gestion de variables de session
Problème avec condition
CMS : Gestion d'un centre d'aide
Plus de sujets relatifs à Gestion des condition en php
 > Tous les forums > Forum Forum des Webmasters