> 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
299,99 €Ecran PC 34 pouces Samsung S34J552WQR ultralarge (WQHD, 4 ms, 75Hz) à 299,99 €
339 € -12%

Amazon fait une promotion sur l'écran PC 34 pouces Samsung S34J552WQR ultralarge qui passe à 299,99 € au lieu de 339 €. Cet écran possède une dalle VA de résolution 3440x1440 à 75 Hz (compatible FreeSync). La fonction Picture-by-Picture intégrée (PBP) permet l'affichage de deux sources différentes côte à côté à leur résolution native. Entrées HDMI et DP.


Voir l'offre
81,99 €Disque dur Seagate BarraCuda 4 To à 81,99 €
90 € -9%

Amazon propose actuellement le disque dur Seagate BarraCuda - 4 To (ST4000DM004) à 81,99 €. Ce disque dur 3.5 pouces SATA III tourne à 5400tr/min et possède 256 Mo de cache. On le trouve ailleurs autour de 90 €. 


Voir l'offre
219,94 €Smartphone 6.55 pouces Xiaomi Mi 11 Lite (5G, Snapdragon 778G, 128Go, 8Go, Android 11) à 219,94 €
299 € -26%

La boutique officielle Xiaomi via AliExpress fait une superbe promotion sur le smartphone 6.55 pouces Xiaomi Mi 11 Lite qui passe à 219,94 € au lieu de 299,99 €. Ce smartphone très bien équipé est compatible 5G, possède un processeur Snapdragon 778G à 8 coeurs, un écran FHD+ (2400x1080) à 90 Hz, 128 Go de stockage extensible par microSD, 8 Go de ram, 3 capteurs photos 64 mégapixels + 8 mégapixels + 5 mégapixels et une caméra avant à 20 mégapixels.

Le tout tourne sous Android 11. Expédition depuis entrepôt français. Pas de douane.


Voir l'offre
16 €Clé USB 3.0 Sandisk Ultra 128 Go à 16 €
20 € -20%

Amazon propose la clé USB Sandisk Ultra d'une capacité de 128 Go à 16 €. On la trouve ailleurs à partir de 20 €. Cette clé USB 3.0 est compatible USB 2.0 et offre de bons débits d'environ 100 Mo/s en lecture et en écriture. Le connecteur est rétractable pour éviter qu'il prenne la poussière.


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