Comment simplifier ce code (question de débutant)?

Lorange
Invité n'ayant pas de compte PHPfrance

15 juin 2005, 13:57

Bonjour,

Je suis parvenu à ce que je voulais faire mais le code est très long et il y a certainement d'autres solutions pour le rendre un peu plus léger.

Voici mon code :

<?


// Ce script affiche une publicité pour le visiteur en fonction de trois critères que le script vérifie :

1) La langue du visiteur (fr, de, en ou po)
2) Son sexe (1 pour homme ou 2 pour femme)
3) Son sport préféré (1 pour football, 2 pour basketball, 3 pour tennis, ...)


// Le visiteur est un homme et son sport préféré est le football (4 lignes car 4 langues)

if ( ($l=='fr') And ($i['sexe']=='1') And ($i['sport_prefere']=='1') ) {include_once('sponsors/fr/articles-de-foot-hommes.php');}
else
if ( ($l=='de') And ($i['sexe']=='1') And ($i['sport_prefere']=='1') ) {include_once('sponsors/de/articles-de-foot-hommes.php');}
else
if ( ($l=='en') And ($i['sexe']=='1') And ($i['sport_prefere']=='1') ) {include_once('sponsors/en/articles-de-foot-hommes.php');}
else
if ( ($l=='po') And ($i['sexe']=='1') And ($i['sport_prefere']=='1') ) {include_once('sponsors/po/articles-de-foot-hommes.php');}
else



// Le visiteur est une femme et son sport préféré est le football (4 lignes car 4 langues)

if ( ($l=='fr') And ($i['sexe']=='2') And ($i['sport_prefere']=='1') ) {include_once('sponsors/fr/articles-de-foot-femmes.php');}
else
if ( ($l=='de') And ($i['sexe']=='2') And ($i['sport_prefere']=='1') ) {include_once('sponsors/de/articles-de-foot-femmes.php');}
else
if ( ($l=='en') And ($i['sexe']=='2') And ($i['sport_prefere']=='1') ) {include_once('sponsors/en/articles-de-foot-femmes.php');}
else
if ( ($l=='po') And ($i['sexe']=='2') And ($i['sport_prefere']=='1') ) {include_once('sponsors/po/articles-de-foot-femmes.php');}
else



// Le visiteur est un homme et son sport préféré est le basketball (4 lignes car 4 langues)

if ( ($l=='fr') And ($i['sexe']=='1') And ($i['sport_prefere']=='2') ) {include_once('sponsors/fr/articles-de-basket-hommes.php');}
else
if ( ($l=='de') And ($i['sexe']=='1') And ($i['sport_prefere']=='2') ) {include_once('sponsors/de/articles-de-basket-hommes.php');}
else
if ( ($l=='en') And ($i['sexe']=='1') And ($i['sport_prefere']=='2') ) {include_once('sponsors/en/articles-de-basket-hommes.php');}
else
if ( ($l=='po') And ($i['sexe']=='1') And ($i['sport_prefere']=='2') ) {include_once('sponsors/po/articles-de-basket-hommes.php');}
else



// Le visiteur est une femme et son sport préféré est le basketball (4 lignes car 4 langues)

if ( ($l=='fr') And ($i['sexe']=='2') And ($i['sport_prefere']=='2') ) {include_once('sponsors/fr/articles-de-basket-femmes.php');}
else
if ( ($l=='de') And ($i['sexe']=='2') And ($i['sport_prefere']=='2') ) {include_once('sponsors/de/articles-de-basket-femmes.php');}
else
if ( ($l=='en') And ($i['sexe']=='2') And ($i['sport_prefere']=='2') ) {include_once('sponsors/en/articles-de-basket-femmes.php');}
else
if ( ($l=='po') And ($i['sexe']=='2') And ($i['sport_prefere']=='2') ) {include_once('sponsors/po/articles-de-basket-femmes.php');}
else




// Le visiteur est un homme et son sport préféré est le tennis (4 lignes car 4 langues)

if ( ($l=='fr') And ($i['sexe']=='1') And ($i['sport_prefere']=='3') ) {include_once('sponsors/fr/articles-de-tennis-hommes.php');}
else
if ( ($l=='de') And ($i['sexe']=='1') And ($i['sport_prefere']=='3') ) {include_once('sponsors/de/articles-de-tennis-hommes.php');}
else
if ( ($l=='en') And ($i['sexe']=='1') And ($i['sport_prefere']=='3') ) {include_once('sponsors/en/articles-de-tennis-hommes.php');}
else
if ( ($l=='po') And ($i['sexe']=='1') And ($i['sport_prefere']=='3') ) {include_once('sponsors/po/articles-de-tennis-hommes.php');}
else



// Le visiteur est une femme et son sport préféré est le tennis (4 lignes car 4 langues)

if ( ($l=='fr') And ($i['sexe']=='2') And ($i['sport_prefere']=='3') ) {include_once('sponsors/fr/articles-de-tennis-femmes.php');}
else
if ( ($l=='de') And ($i['sexe']=='2') And ($i['sport_prefere']=='3') ) {include_once('sponsors/de/articles-de-tennis-femmes.php');}
else
if ( ($l=='en') And ($i['sexe']=='2') And ($i['sport_prefere']=='3') ) {include_once('sponsors/en/articles-de-tennis-femmes.php');}
else
if ( ($l=='po') And ($i['sexe']=='2') And ($i['sport_prefere']=='3') ) {include_once('sponsors/po/articles-de-tennis-femmes.php');}
else


else
include_once('sponsors/multilingue/tous-les-sports.php');


?>



2) (2ème question)

La langue du site, par défaut, est le français. C'est à dire que si le visiteur veut afficher la page en français, il peut y accéder par :

page.php?l=fr
page.php?l=default
page.php?l=

Ces trois solutions vont afficher la page en français. Dans le code ci-dessus, je n'ai pas parlé des deux autres valeurs possibles de cette variable ('default' et ' ').

Mais est-il possible, dans le code ci-dessus, pour la ligne en français, d'écrire quelque chose telle que :

if ($l='fr', 'default', ' ') and ........... {include_once('sponsors/fr/articles-de-foot-hommes.php');}

plutôt que de faire une ligne, à chaque fois pour

if $l=fr

if $l=default

if $l=

?


Merci d'avance pour votre aide car je n'ai vraiment pas trouvé de solution malgré mes recherches sur le for, switch, etc. auxquels je n'ai pas compris grand' chose. :(



[/php]

Eléphant du PHP | 128 Messages

15 juin 2005, 14:05

hum.... je suis pas sur qu'un autre structure soit plus efficace (peut etre avec des switch() imbriqués ...)

Pour ton probleme avec la langue par default tu peux utiliser ca if($l=="fr" || $l=="default" || $l=="")
C'est pas moi qui ai volé l'orange !

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

15 juin 2005, 14:05

en vrac et à première vue

effectivement beaucoup de "if then else" donc tu pourrais continuer à chercher du coté du switch

on voit que dans ces lignes :
// Le visiteur est un homme et son sport préféré est le football (4 lignes car 4 langues)

if ( ($l=='fr') And ($i['sexe']=='1') And ($i['sport_prefere']=='1') ) {include_once('sponsors/fr/articles-de-foot-hommes.php');}
else
if ( ($l=='de') And ($i['sexe']=='1') And ($i['sport_prefere']=='1') ) {include_once('sponsors/de/articles-de-foot-hommes.php');}
else
if ( ($l=='en') And ($i['sexe']=='1') And ($i['sport_prefere']=='1') ) {include_once('sponsors/en/articles-de-foot-hommes.php');}
else
if ( ($l=='po') And ($i['sexe']=='1') And ($i['sport_prefere']=='1') ) {include_once('sponsors/po/articles-de-foot-hommes.php');}
else 
seul changement la langue, que tu as dans ta variable donc pourquoi ne pas faire :
if ($i['sexe']=='1') And ($i['sport_prefere']=='1')
{include_once('sponsors/'.$l.'/articles-de-foot-hommes.php');}
sinon pourquoi une page pour chaque type d'articles ?
on aurait pu voir un seul modèle de page qui sélectionne directement les articles suivant les variables, en construisant la requête dynamiquement

Invité
Invité n'ayant pas de compte PHPfrance

15 juin 2005, 14:08

merci à vous deux.

Pour l'insertion de la variable dans l'include, comme tu le proposes, je croyais que c'était à éviter (faille du include), non?

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

15 juin 2005, 14:09

une autre piste : construire ton include() dynamiquement
avec des tableaux de correspondances id=>libellé
$tabSports = Array(1 => "foot", 2=>"tennis");
$tabSexes = Array(1=>"homme", 2=>"femme");

include_once('sponsors/'.$l'./articles-de-'.$tabSports[$i['sport_prefere']].'-'.$tabSexes[$i['sexe']].'.php');

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

15 juin 2005, 14:10

Pour l'insertion de la variable dans l'include, comme tu le proposes, je croyais que c'était à éviter (faille du include), non?
à toi de sécuriser ça et de limiter ce qu'on peut insérer dedans,
si telle ou telle valeur on insère
sinon on insère une valeur par défaut

Eléphant du PHP | 128 Messages

15 juin 2005, 14:12

En fait oui une structure avec des switch serait plus efficace(puisque tu n'est pas obliger de faire tous les test a chaque fois)

donc
switch($l)
{
case 'fr':
    switch($sport)
     {
        case 1:
                switch($sexe)
                 {
                   case 1:
                    //include
                    break;
                    case 2:
                    //include
                    break;
                  }
         break;
        case 2:
         //code switch
         break:
        case 3:
         //code switch
         break;
break;

case 'de':
//code
break;

etc.....

}
Fait bien attention a mettre des break a la fin de chaque case.

EDIT : l'idee des tableaux des ouckileou est carrement excellente :)
C'est pas moi qui ai volé l'orange !

Invité
Invité n'ayant pas de compte PHPfrance

15 juin 2005, 14:15

Les tableaux de correspondance... ça me semble peu adéquat car en fait mon code devrait être encore très flexible par la suite. Donc je préférerais rester sur une strucutre similaire à celle proposée.

Par contre, la variable dans l'include me paraît très intéressant. Mais pourrais-tu détailler la façon de la protéger?

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

15 juin 2005, 14:16

par exemple pour le sexe

(partons du principe tu ne gères que 2 sexes :lol:)

quand tu récupères ta variable dans l'url tu testes avant de créer ton include
$sexe = ($i['sexe'] == 1 || $i['sexe'] == 2)?$i['sexe']:1;
le code ci-dessu veut dire :
Si $i['sexe'] vaut 1 ou vaut 2 alors je met $i['sexe'] dans $sexe
Sinon je met sexe par défaut 1

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

15 juin 2005, 14:17

justement si ton type de page à appeler reste le même les tableaux de correspondances peuvent convenir

si tu as tjrs /sponsors/langue/articles-de-sport-sexe

alors tu pourras rajouter facilement des langues, sports et sexes

enfin pour les sexes ça sert moins forcément... ;)

édition :

et tu pourras garder le type de tests que je t'ai donné sans le changer à chaque fois
$sport = ($i['sportPréféré'] > 0 && $i['sportPréféré']<= count($tabSports))?$i['sportPréféré']:1;
Modifié en dernier par ouckileou le 15 juin 2005, 14:21, modifié 2 fois.

Invité
Invité n'ayant pas de compte PHPfrance

15 juin 2005, 14:20

Ok, mais mon sexe prend chez moi 4 valeurs :)

Homme, femme, trans et couple

(mon site est en fait un site de rencontres :p mais j'ai essayé de simplifier ;))

Finalement, l'idée du switch me paraît pas trop mal...

Je peux y écrire case "fr" || "default" || "" ?

Eléphant du PHP | 128 Messages

15 juin 2005, 14:24

ben tu veux un code tres flexible mais les tableaux te permettrons de le mettre rtes facilement a jour (plutot que te retaper a chaque fois les lignes de codes tes tests (imagine tu rajoute une langue -> tu devrait rajouter ce test a chaque fois) , franchement je suis fan de l'idée du tableau 8)
C'est pas moi qui ai volé l'orange !

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

15 juin 2005, 14:25

et bien de la vision que j'en ai le système des tableaux me parait convenir
$tabSexes = Array(1=>"homme", 2=>"femme", 3=>"trans",4=>"couple");

$sexe = ($i['sexe'] > 0 && $i['sexe'] <= count($tabSexes))?$i['sexe']:1;
avec ce test :
$i['sexe'] > 0 && $i['sexe'] <= count($tabSexes)
tu vérifies que la valeur transmise est comprise entre 1 et 4 sinon tu prends 1 par défaut

et le tableau te permettra de rajouter facilement un 5ième choix "animaux" si tu fais un site de rencontres très, très ouvert :lol:

Invité
Invité n'ayant pas de compte PHPfrance

15 juin 2005, 14:27

Oui j'en suis convaincu mais le problème c'est que ma publicité ne suit pas toujours une logique aussi implacable que celle présentée ici. Donc ça n'irait pas vraiment pour ce que je veux faire après.

Donc je vais quand même rester au switch...

par contree, est ce que ça va aller si j'écris, pour le français, qqch du genre :

case ' "fr" || "default" ||"" ':

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

15 juin 2005, 14:29

ben pas vraiment, voici un exemple de syntaxe
switch($l) {
   case 'en' : $langue = "anglais"; break;
   case 'de' : $langue = "allemand"; break;
   default : $langue = "français";
}