IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Tableaux] Problème avec un opérateur ternaire et une boucle


Sujet :

Langage PHP

  1. #1
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut [Tableaux] Problème avec un opérateur ternaire et une boucle
    Bonjour à tous,

    Je veux utiliser un opérateur ternaire dans une boucle pour que mon select soit selected selon les données de la base. Il y a 4 valeurs possibles: header, footer, gauche et droite...Voici ce que j'ai fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    $a = 0;
    $sell = "";
    $posit = array("header", "footer", "droite", "gauche");//je déclare les 4 valeurs dans un tableau
     
    while($row = mysql_fetch_array($sql))
    {
     
    $sell[$a] = ($posit[$a] == $row["posi"] ) ? ' selected="selected" ' : '';
     
    echo "<tr><td><select name='posi[]'><option value='header' ".$sell[$a].">Header</option><option value='footer' ".$sell[$a].">Footer</option><option value='gauche' ".$sell[$a].">Gauche</option><option value='droite' ".$sell[$a].">Droite</option></select></td></tr>"
    $a++;
    }
    Je n'ai ni notice, ni warning, mais l'affichage des selects est complètement fantaisiste...
    Si quelqu'un voit l'erreur...je veux bien un tuyau ! D'avance merci.

  2. #2
    Membre expert Avatar de Amara
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 688
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 688
    Points : 3 115
    Points
    3 115
    Par défaut
    Tu peux expliquer un peu parce que tu incrémentes $a lors du parcours des résultats ; du coup $a prend une valeur supérieure à 4 au bout de quatre tours de boucle, et ton tableau n'a que 4 éléments.
    Pas de questions techniques par MP, le forum est là pour ça et est plus efficace.

    Orthographe : une connexion (avec un x), un langage (sans u), une requête (un seul t), 'une quote' (avec qu), une syntaxe (sans h)

  3. #3
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    d'abord merci de te pencher sur mon cas !
    et oui il doit y avoir un loup à ce niveau...
    Ma table n'a que 4 lignes pour le moment, mais quand elle en aura 10 ça va coincer parce que effectivement mon tableau n'aura toujours que 4 valeurs...
    Je suis un peu perdu, là...

  4. #4
    Membre expert Avatar de Amara
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 688
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 688
    Points : 3 115
    Points
    3 115
    Par défaut
    Essaie de nous expliquer un peu ce que tu souhaite faire.

    Sinon essaie d'abord avec un if classique avant d'attaquer l'opérateur ternaire.
    Pas de questions techniques par MP, le forum est là pour ça et est plus efficace.

    Orthographe : une connexion (avec un x), un langage (sans u), une requête (un seul t), 'une quote' (avec qu), une syntaxe (sans h)

  5. #5
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    dans une table nomée page, j'enregistre la mise en page. Comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    id_mod  posi  ordre  
     
    1     droite     1 
    2     header   1 
    3     gauche   1 
    4     gauche   2
    en mode modification, je lis cette table et j'affiche 4 select, un par module. le user doit pouvoir modifier la position et l'ordre de chaque module. Je voulais que les select soient selected en fonction de son choix à la création.

  6. #6
    Membre expert Avatar de Amara
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 688
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 688
    Points : 3 115
    Points
    3 115
    Par défaut
    Je pense qu'il y a un problème dans ta condition elle-même. Affiche les valeurs que tu utilises pour ton test, tu verras si ça correspond à ce que tu veux.
    Pas de questions techniques par MP, le forum est là pour ça et est plus efficace.

    Orthographe : une connexion (avec un x), un langage (sans u), une requête (un seul t), 'une quote' (avec qu), une syntaxe (sans h)

  7. #7
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    je viens d'afficher les valeurs de la table et celles du tableau, elles correspondent bien ! à s'arracher les cheveux. Je vais essayer avec un if classique...

  8. #8
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Je galère vraiment grave ! personne n'a une idée ou une piste ?

  9. #9
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    moi il y'à un truc qui me choque direct dans ton code. Tu passe d'un string ($sell = "") à un tableau ($sell[$a]).

    Tu peux deja regarder par la.

    Pour le reste j'ai pas trop compris la manoeuvre.

  10. #10
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Salut

    Je pense que tu compliques les choses pour rien. Par exemple le résultat de ton opérateur ternaire : tu ne l'utilisera pas en-dehors de la boucle, c'est donc une valeur temporaire au même titre que $row (tu peux les écraser sans complexe lors de chaque itération). À ce titre, je te suggère de prendre un nom de variable simple plutôt qu'un tableau : $selected me paraît relativement judicieux.

    Ensuite, je te recommande de sortir de php (à l'aide de ?>) lorsque tu souhaites afficher des blocs de HTML, surtout si tu imbriques des balises dedans. Tu t'y retrouveras bien mieux, surtout si ton éditeur de code fait de la colorisation de HTML (si ce n'est pas le cas, tu peux éventuellement considérer de changer d'éditeur...).

    Pour terminer, l'idée me semble globalement mauvaise. Un <select> ne devrait contenir qu'un seul element <option> qui soit "selected", or ton code en autorise visiblement plusieurs.
    Typiquement, dans ce genre de cas, nous ne comparons pas 2 tableaux mais un tableau et ue valeur fixe. Pourquoi ? Parce que, en comparant 2 tableaux comme tu le fais, tu t'exposes à avoir éventuellement 2 "selected", ce qui est incorrect.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if ($posit[$a] == $row["posi"] ) // pas bon
    if ($posit == $row["posi"] ) // ok si `posi` est un champ UNIQUE dans la BDD

  11. #11
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Bonjour, oui, je pense que vous avez raison, et que je vais tout recommencer à 0. Pourtant au départ l'idée me paraissait simple: le tableau HTML affiche 5 select parce qu'il y a 5 modules écrits dans la table, donc 5 positions. Je ne dois bien sûr avoir qu'un seul option selected par select, celui qui figure dans le champ "posi". Mais Yogui je comprends pas un truc: tu me dis que ça c'est bon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ($posit == $row["posi"] ) // ok si `posi` est un champ UNIQUE dans la BDD
    Comment je peux comparer les valeurs de $row["posi"] avec $posit dont la valeur est array ???
    Mais de toute façon mon idée n'est pas bonne puisque mon array() ne prend que 4 élèments, alors que la boucle while peut lire 10 lignes dans la table, donc afficher 10 selects contenant chacun les 4 élèments (header, droite,gauche,footer)...ou la la...

  12. #12
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Salut

    En effet, tu as mis le doigt sur le problème : tu compares avec un array, ce n'est pas la bonne méthode. Tu dois comparer un élément qui ne changera pas du tout pendant ta boucle avec un élément qui change pendant ta boucle (et non comparer deux éléments qui changent pendant ta boucle, comme tu le fais actuellement).
    C'est tout ce qu'il y a à changer.

  13. #13
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    oui, je crois que j'imagine le truc...si tu veux, dans mon idée 1ere, le array contenant les 4 élèments de chaque select était l'élèment qui ne changeait pas dans la boucle, en comparaison avec la lecture table elle-même...me revoila au point de départ... sauf que je vois pas avec quoi comparer ! et le plus rageant, c'est que je l'affiche en clair à coté de chaque select dans une colonne "ancienne position" avec
    qui lit bêtement le champ posi...
    mais pas moyen de faire bouger ce maudit select !

Discussions similaires

  1. problème avec l'opérateur ternaire "? :"
    Par jmclej dans le forum C#
    Réponses: 5
    Dernier message: 21/04/2015, 12h22
  2. Problèmes avec inputdlg à l'intérieur d'une boucle
    Par laulau301090 dans le forum MATLAB
    Réponses: 3
    Dernier message: 26/04/2013, 20h25
  3. Réponses: 2
    Dernier message: 28/12/2008, 18h51
  4. Réponses: 5
    Dernier message: 26/07/2006, 11h13
  5. [Tableaux] Problème avec Switch case
    Par philippef dans le forum Langage
    Réponses: 4
    Dernier message: 07/09/2005, 16h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo