Structure "if{} else{ if{} else {} }" trop répétitive ?

Structure "if{} else{ if{} else {} }" trop répétitive ? - PHP - Programmation

Marsh Posté le 11-09-2005 à 16:00:46    

Bonjour,  
 
Je code actuellement un site en PHP, et j'aurais besoin de votre aide pour une partie de mon code qui ne me semble vraiment pas du tout optimale...  
 
C'est dans la partie qui concerne l'inscription.  
Je fais plusieurs vérifications successives, ce qui revient à faire une structure en if et else que je trouve un peu lourde. Je vous en met une représentation simplifiée, et si jamais vous aviez une idée sur la manière de m'y prendre pour tout simplifier, ça m'aiderai beaucoup.
 
Voilà c'est du genre :
 
 

Citation :

Si un des champs est vide
{
 header qui renvoie vers une page d'erreur
}
Sinon
{
 Si tous les champs sont remplis
 {
  Si le pass posté et sa confirmation sont différents
  {
   header qui renvoie vers une page d'erreur
  }
  Sinon
  {
   Si .....
   {
    //instructions
   }
   Sinon
   {
    //instructions, et encore des if et else qui sont imbriqués
   }
  }
 }
}


 
Voilà, j'espère que c'est assez clair... désolée, mais je vois pas comment mieux présenter ça, le quote m'a paru pas mal vu qu'il permet de mettre en gras..
En cas de besoin sinon, je peux poster le code, ou donner plus d'informations, y'a qu'à demander :)
 
Edit : précision, parce que j'ai pas l'impression de l'avoir bien dit : les imbrications continuent, c'est à dire que j'arrive à une "profondeur" de..... 10 !  :sweat:  C'est pour ça que je trouve ça lourd...


Message édité par $temp le 12-09-2005 à 08:35:57
Reply

Marsh Posté le 11-09-2005 à 16:00:46   

Reply

Marsh Posté le 11-09-2005 à 16:44:12    

Il ne faut pas tu voye cela comme lourd.
 
A pars utiliser IF et ELSE, il n'y a pas grand chose à faire. Ce sont juste des conditions qui te permette d'exécuter une partie de code bien spécifique.


Message édité par AlphaZone le 11-09-2005 à 16:44:55
Reply

Marsh Posté le 11-09-2005 à 16:52:38    

Au pire tu peux espacer tes blocs et les identer pour les voir facilement, mais a part ca pas vraiment de solution ^^'


---------------
http://www.alsacreations.com , http://www.openweb.eu.org. Mon CV : http://cv.roane-irkana.net/. Exemple à ne surtout pas suivre : www.worldinternet.be
Reply

Marsh Posté le 11-09-2005 à 17:12:48    

En fait, si tu veux "alleger" ton code, commence par te concentrer sur ce qui cense etre le comportement normal. Tu pourrais par exemple faire une premiere condition "tous champs remplis et pass identique a confirmation" avec dedans le traitement classique de l'inscription, le traitement des erreurs venant par apres avec un raffinement eventuel. Un autre exemple serait de faire un condition "un champs est vide ou pass different de confirmation" et dans ce cas, renvoyer le tout a une autre page que traite les erreurs.

Reply

Marsh Posté le 11-09-2005 à 17:42:21    

C'est quoi la différence entre :
le "else" de "un des champs est vide" et le "alors" de "tous les champs sont remplis"
 
PS : Quand on décrit les étapes d'un programme comme ici, c'est de l'algo, pas du php vu que c'est un algorythme qui est valable quelque soit le langage qui sera utilisé plus tard.

Reply

Marsh Posté le 11-09-2005 à 18:29:48    

Pour que ça fasse moins lourd, je te conseille de faire des fonctions et de les appeler au moment du submit, ça fera moins lourd, et ce sera plus facilement maintenable


Message édité par onizuka_sensei le 11-09-2005 à 18:30:21
Reply

Marsh Posté le 11-09-2005 à 19:17:35    

Déjà quand ton else ne contient qu'une structure if, fais else if, ça t'évitera un étage de plus (cas de tes deux premiers else).
 
Autre chose, quand tu fais un header de redirection, pas besoin de "else" après, tu fous un exit() et basta, la suite ne sera exécutée que si on est pas passé dans le if de base de toutes façons (idem, dans une fonction, jamais de else après un return placé dans un if).
 
Et si tu fous ça dans une fonction, tu peux te débrouiller pour placer un return après chaque "mauvais cas", du coup tu restes avec un seul étage tout le temps ("programmation skip" ). Certains préfèrent un style avec un seul return à la fin (mais tu te trimballes pleins d'étages et/ou des variables d'état), à toi de voir ce qui te convient le mieux.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 11-09-2005 à 19:27:47    

"quand tu fais un header de redirection, pas besoin de "else" après"
je suis pas du tout d'accord, c'est pas par ce que tu fais une redirection quand tout est bon que tu ne veux rien faire quand il y a des erreurs ou inversement.
Les exit; sont parfois utile mais utilisé tel que tu l'indiques, c'est digne des goto en basic : de la mauvaise programmation qui oblige de tout lire pour savoir pourquoi ca ne marche pas comme prévus.
Au moins avec des if elseif indenté comme il faut on voit rapidement où ca bloque.

Reply

Marsh Posté le 11-09-2005 à 19:33:43    

omega2 a écrit :

"quand tu fais un header de redirection, pas besoin de "else" après"
je suis pas du tout d'accord, c'est pas par ce que tu fais une redirection quand tout est bon que tu ne veux rien faire quand il y a des erreurs ou inversement.


 
Je vois pas le rapport. Quand tu rediriges, t'as plus rien à faire dans la page, a priori.
 

Citation :

Les exit; sont parfois utile mais utilisé tel que tu l'indiques, c'est digne des goto en basic : de la mauvaise programmation qui oblige de tout lire pour savoir pourquoi ca ne marche pas comme prévus.
Au moins avec des if elseif indenté comme il faut on voit rapidement où ca bloque.


 
De quelles erreurs ou blocages tu parles là ? [:mlc]


Message édité par sielfried le 11-09-2005 à 19:34:10

---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 11-09-2005 à 19:35:28    

Et puis ça a strictement rien à voir avec goto, accessoirement.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 11-09-2005 à 19:35:28   

Reply

Marsh Posté le 11-09-2005 à 19:39:29    

sielfried a écrit :

Je vois pas le rapport. Quand tu rediriges, t'as plus rien à faire dans la page, a priori.

Tu peux trés bien envoyer le signal de redirection sans avoir finis les traitements. Par exemple, tu peux avoir prévus une fermeture de la base de donnée ou de noter dans un fichier combien de temps le script à mis pour s'exécuter et ce en le faisant qu'a un seul endroit. Avec un exit, t'as plus tout ça.
 

sielfried a écrit :

De quelles erreurs ou blocages tu parles là ? [:mlc]

KLe jour où t'as un test qui foire, vas y pour savoir lequel avec des exit partout. C'est de la programmation spaguetis au même titre que les goto.

Reply

Marsh Posté le 11-09-2005 à 19:45:12    

omega2 a écrit :

Tu peux trés bien envoyer le signal de redirection sans avoir finis les traitements. Par exemple, tu peux avoir prévus une fermeture de la base de donnée ou de noter dans un fichier combien de temps le script à mis pour s'exécuter et ce en le faisant qu'a un seul endroit. Avec un exit, t'as plus tout ça.


 
Après un header de redirection, y'a plus rien à foutre sur le .php en cours, stout. Si t'as un truc à faire, tu le fais avant ou sur la page redirigée, mais pas après la redirection, ça a aucun sens.
 
C'est dans la doc :

Code :
  1. <?php
  2. /* Redirige le client vers le site PHP */
  3. header("Location: http://www.php.net/" );
  4. /* Garantie que le code ci-dessous n'est jamais exécuté. */
  5. exit();
  6. ?>


 

Citation :


KLe jour où t'as un test qui foire, vas y pour savoir lequel avec des exit partout. C'est de la programmation spaguetis au même titre que les goto.[/quotemsg]


 
J'ai jamais parlé d'exit partout...  :sarcastic:  
 
Si tu me parles des multiples return dans une fonction, faudra que tu m'expliques ce que ça change pour vérifier un test qui foire, paskeu j'vois pas du tout le rapport.


Message édité par sielfried le 11-09-2005 à 19:45:50

---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 12-09-2005 à 08:33:54    

onizuka_sensei a écrit :

Pour que ça fasse moins lourd, je te conseille de faire des fonctions et de les appeler au moment du submit, ça fera moins lourd, et ce sera plus facilement maintenable


 
Justement, j'ai l'impression que quand je code, je raisonne pas forcément comme il faut pour les fonctions..
Pour moi, elles servent en fait surtout à faire des calculs... et encore, la plupart du temps même pour mes calculs, je n'en utilise pas.. Est-ce que vous pourriez me dire par exemple où je pourrai utiliser des fonctions dans mon code là ? Parce que je vois pas trop leur utilité... Plus rapides ? Plus simples à comprendre pour quelqu'un qui lit le code ?

Reply

Marsh Posté le 12-09-2005 à 08:38:51    

Pour ce qui est de exit() que je n'ai jamais utilisé (je connaissais pas), la doc PHP dit :
 
"exit() termine l'exécution du script courant. Elle n'a pas de valeur de retour (et pour cause !), mais elle utilisera le message status comme message de fin d'exécution."
 
Est-ce que ça veut dire que je ne peux pas faire de redirection avec ?  
En effet, mes headers renvoient sur la même page, ils indiquent juste le message d'erreur que je dois afficher.
 

Reply

Marsh Posté le 12-09-2005 à 08:42:33    

Le but des fonctions est justement de mettre les gros traitements que tu refais plusieurs fois dans un fichier a part que t'inclues au début des scripts qui en ont besoin.
 
Tu n'as ensuite qu'a appeler la fonction. bien sur il faut la programmer pour qu'elle retourne par exemple vrai ou faux sur des tests, ou le résultat d'un calcul, avec le mot clé return.
 
Courage :)


---------------
http://www.alsacreations.com , http://www.openweb.eu.org. Mon CV : http://cv.roane-irkana.net/. Exemple à ne surtout pas suivre : www.worldinternet.be
Reply

Marsh Posté le 12-09-2005 à 08:42:53    

$temp a écrit :

Est-ce que ça veut dire que je ne peux pas faire de redirection avec ?


Exit n'a pas pour but de rediriger, tu le mets juste derrière ton header de redirection (qui, lui, redirige) de cette manière tu es assuré que le script s'arrête
=> Pas d'effets de bord
=> Pas d'exécutions non nécessaire de code (qui ralentirait le chargement de la page)
 
La redirection est envoyée immédiatement après que le script se soit dit "tiens, faut que je redirige"


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
Reply

Marsh Posté le 12-09-2005 à 10:04:41    

$temp a écrit :


Edit : précision, parce que j'ai pas l'impression de l'avoir bien dit : les imbrications continuent, c'est à dire que j'arrive à une "profondeur" de..... 10 !  :sweat:  C'est pour ça que je trouve ça lourd...


C'est peut-être a toi de voir si tu ne fais pas des test inutile
 
Mais tu peux faire 20 niveau ca ne changera rien. Ce sont des conditions et si t'as beaucoup de vérification à faire, il n'y a rien a faire. C'est le codage qui le veut.
 
Comme le disait omega2, il faut que tu fasse des algoritmes, ainsi tu verras mieu le contenu de ta page.

Reply

Marsh Posté le 12-09-2005 à 10:12:42    

AlphaZone a écrit :

Comme le disait omega2, il faut que tu fasse des algoritmes, ainsi tu verras mieu le contenu de ta page.


C'est déjà un algorythme qu'il fait, mais d'aprés son premier message, c'est clair qu'il fait des tests redondant. Déjà son second test est redondant par rapport au premier vu que s'il n'y a pas de zone vide, c'est que toutes les zones sont remplis donc pas besoin de retester ça.

Reply

Marsh Posté le 12-09-2005 à 10:16:18    

Ben si je fais ce test, c'est parce que chez moi, je ne comprends pas pourquoi, mais si je fais par exemple un formulaire, et que je veux vérifier une fois envoyé si c'est vide ou pas, un isset($lavariable) ne suffit pas... Je suis toujours dans l'obligation de faire un if (isset($lavariable) AND $lavariable != "" ) si je veux que ça marche...

Reply

Marsh Posté le 12-09-2005 à 10:17:46    

$temp a écrit :

Ben si je fais ce test, c'est parce que chez moi, je ne comprends pas pourquoi, mais si je fais par exemple un formulaire, et que je veux vérifier une fois envoyé si c'est vide ou pas, un isset($lavariable) ne suffit pas... Je suis toujours dans l'obligation de faire un if (isset($lavariable) AND $lavariable != "" ) si je veux que ça marche...


 
http://fr3.php.net/empty


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 12-09-2005 à 10:20:54    

Ma page fait ce genre de chose en fait :
 
 
Si y'a un message d'erreur à mettre à cause d'un header, on le met
 
Si des variables ont été postées
 -> Alors vérif de tout ça, et si c'est bon, à la fin inscription et affichage d'une page comme quoi ça a marché. Si c'est pas bon, des headers renvoient sur la même page, mais en précisant un message d'erreur à afficher.
 
Sinon, si y'a pas de variables postées, c'est soit que la personne vient sur la page pour la première fois, soit qu'elle est revenue ici après un header, et alors on affiche le formulaire.
 

Reply

Marsh Posté le 12-09-2005 à 10:26:04    

$temp a écrit :


Edit : précision, parce que j'ai pas l'impression de l'avoir bien dit : les imbrications continuent, c'est à dire que j'arrive à une "profondeur" de..... 10 !  :sweat:  C'est pour ça que je trouve ça lourd...


 
Ben on t'a donné des solutions viables. Une fonction booléenne de vérification n'a dans la plupart des cas pas besoin de dépasser la profondeur 1.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 12-09-2005 à 10:48:24    

J'ai réussi à éclaircir un peu mon code. Je sais pas si ce sera plus rapide ou pas, vu que ça revient un peu au même qu'avant, mais c'est en tout cas beaucoup plus lisible pour quelqu'un d'extérieur je trouve.
 
C'est juste avec un if, puis des elseif pour faire les vérifications successivement, et au fur et à mesure, je mets mes headers si une vérif n'est pas bonne.
En tout cas, ça marche.
 
Merci pour vos informations et pour les renseignements que vous m'avez donné. Si ça ne me sert pas tout de suite, ça me servira surement dans le futur.
Merci également pour cet éclaircissement quant à empty() et isset()

Reply

Marsh Posté le 13-09-2005 à 01:18:22    

masklinn a écrit :

Exit n'a pas pour but de rediriger, tu le mets juste derrière ton header de redirection (qui, lui, redirige) de cette manière tu es assuré que le script s'arrête
=> Pas d'effets de bord
=> Pas d'exécutions non nécessaire de code (qui ralentirait le chargement de la page)
 
La redirection est envoyée immédiatement après que le script se soit dit "tiens, faut que je redirige"


 
 
ahhh ouai pas mal le coup du exit.  
 
Parce que je suis obligé à chaque fois de mettre des if inutile parce que le code continue d'etre meme apres une redirection, je trouve cela assez stupide. Le seul avantage, c'est que ca permet de faire des traitement en background. Tu es redirigé sur la page et tu as des traitement lourds qui continue toujours.
 
omega2, pour debugguer et retrouver par quel header tu es rediriger, tu fais simplement un echo dans la page. Tu aura un message d'erreur comme c'est interdit de faire un echo avant un header mais tu aura le n° de ligne du header utilisé.  
 
 

Reply

Marsh Posté le 13-09-2005 à 08:39:15    

weed a écrit :


Parce que je suis obligé à chaque fois de mettre des if inutile parce que le code continue d'etre meme apres une redirection, je trouve cela assez stupide. Le seul avantage, c'est que ca permet de faire des traitement en background. Tu es redirigé sur la page et tu as des traitement lourds qui continue toujours.


Pas nécessairement, il y a un risque non négligeable que les traitements se terminent avant que le buffer envoie le header :o
 
De plus envoyer l'utilisateur sur une page dépendant de traitements spécifiques alors que ces traitements ne sont pas terminés est dangereux :o
 
Enfin celà empêche tout retour d'erreur à l'utilisateur (puisque les traitements qu'il a lancés s'effectuent sans possibilité de feedback)


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
Reply

Marsh Posté le 13-09-2005 à 09:07:18    

weed a écrit :

omega2, pour debugguer et retrouver par quel header tu es rediriger, tu fais simplement un echo dans la page. Tu aura un message d'erreur comme c'est interdit de faire un echo avant un header mais tu aura le n° de ligne du header utilisé.

Bidouilleur et bidouillé sont dans un bateau qui c'est qui tombe à l'eau?
Même si ca marche d'habitude, pour moi c'est du niveau des positions -5000 en css. Ca marche en général mais c'est ni beau ni propre.
Je dis que ca marche "d'habitude" par ce que rien ne dit que cet affichage ne sera pas désactivé sur le serveur où le probléme est constaté.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed