fonction pour préselectionner une option dans une liste déroulante

Eléphant du PHP | 206 Messages

10 nov. 2007, 00:38

Bonsoir,

Me voici confronter à un problème.
Voici déja un petit screenshot
Image

Les 7 listes déroulantes sont identiques et sont fait par une boucle.
J'aimerais que pour chacune des listes soit présélectionné l'option qui est enregistré dans la BDD.

Voici la requete

$entrainement = mysql_query('SELECT entrainement1, entrainement2, entrainement3, entrainement4, entrainement5, entrainement6, entrainement7 FROM equipes WHERE id_membre='.$_SESSION['id']);
$entrainement2 = mysql_fetch_assoc($entrainement);

Et voici le code actuel avec ma fonction masi ça ne fais rien :(
<?php 
 $i= 1;


function pardefaut($choix) 
{
$par_defaut = '';
$entrainement = 'entrainement'.$i;
        if ($entrainement2[$entrainement] == $choix)
        {
            $par_defaut='selected="selected"';
        }
 

return $par_defaut; 
}

 $i= 1;
 while ( $i <= 7)
{ 



?>
Jour <?php echo $i;?> :
<br />
<?php echo " &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp" ?>
<select name="entrainement<?php echo $i;?>">
<option value="0" <?php echo pardefaut('0'); ?>>:: Repos ::</option>
<option value="1"<?php echo pardefaut('1'); ?>>Général</option>
<option value="2"<?php echo pardefaut('2'); ?>>Tir</option>
<option value="3"<?php echo pardefaut('3'); ?>>3 points</option>
<option value="4"<?php echo pardefaut('4'); ?>>Dribble</option>
<option value="5"<?php echo pardefaut('5'); ?>>Passe</option>
<option value="6"<?php echo pardefaut('6'); ?>>Rebond</option>
<option value="7"<?php echo pardefaut('7'); ?>>Contre</option>
<option value="8"<?php echo pardefaut('8'); ?>>Interception</option>
</select>
<br />
<?
$i++;
}

Si quelqu'un a une idée ce serait super sympa.
Bonne soirée à tous

ViPHP
ViPHP | 2287 Messages

10 nov. 2007, 00:52

Bonsoir,

A première vue, tu ne transmets pas $entrainement2 vers ta fonction (qui du coup ne peut pas tester grand chose...). Un oubli peut-être ? :D
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

10 nov. 2007, 01:16

Parenthèse de normalisation :
Tu aurais pu (du) séparer les "entrainements" dans 2 autre tables.
Une équipe peut avoir plusieurs entrainement (ici 7) et un entrainement donné peut être suivis par plusieurs équipes.
Donc une table équipe (que tu as) avec un id_equipe une table entrainement (avec 2 champs id et type) pour les différents entrainements (Repos, général, tir etc.) et une table entre les deux pour faire le lien (id_equipe, id_entrainement).
Cette dernière récolte les entrainements auxquels participe une équipe.

Ex.
Equipe 23 participe aux entrainements ( 1-Repos, 2- Général ) tu auras dans cette table 2 enregistrements avec
23 - 1
23 - 2

Equipe 45 entrainements 1 et 5
45 - 1
45 - 5

Voilà fin de la parenthèse.
Ta fonction comme dit par Calimero est incomplète. Je pense que tu as saisie le truc mais tu peux toujours regarder CECI

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 206 Messages

10 nov. 2007, 12:07

Truc > merci de passer sur mes topics à chaque fois et d'apporter une réponse claire :D

Donc toujours cette histoire de normalisation.
J'avoue que niveau optimisation etc j'ai du mal à me dire actuellement j'utilsie une même table pour l'entrainement et tout et donc une requete me donne toutes les infos sur une équipe. MAIS il faudrait que j'utilise 3 tables pour un même résultat. :shock:

A savoir entrainement1 correspond à l'entrainement du lundi entrainement 2 a l'entrainement du mardi etc... Je veux dire par la qu'il y a une relation entre les 7 entrainements qu'une équipe à choisi. Alors qu'avec les 3 tables ont en tiens compte nulpart.


As tu un lien avec une bonne explication agrémenter d'exemple sur le sujet à me fournir ? (un peu plus complet que le lien que tu m'avais donné précedemment sur l'autre topic :) )


MessagePosté le: 10 Nov 2007, 00:16 Sujet du message:
Parenthèse de normalisation :
Tu aurais pu (du) séparer les "entrainements" dans 2 autre tables.
Une équipe peut avoir plusieurs entrainement (ici 7) et un entrainement donné peut être suivis par plusieurs équipes.
Donc une table équipe (que tu as) avec un id_equipe une table entrainement (avec 2 champs id et type) pour les différents entrainements (Repos, général, tir etc.) et une table entre les deux pour faire le lien (id_equipe, id_entrainement).
Cette dernière récolte les entrainements auxquels participe une équipe.

Ex.
Equipe 23 participe aux entrainements ( 1-Repos, 2- Général ) tu auras dans cette table 2 entrainements avec
23 - 1
23 - 2

Equipe 45 entrainements 1 et 5
45 - 1
45 - 5

Voilà fin de la parenthèse.
Ta fonction comme dit par Calimero est incomplète. Je pense que tu as saisie le truc mais tu peux toujours regarder CECI
Tu voulais me donner un lien ? ou juste me dire de lire ton post

Calimero > Je pensais que comme ma fonction était implanté au milieu de mon code (et que la requete était au dessus...

Donc je dois le faire passer de la façon suivante

function pardefaut($choix, $entrainement2)


Merci à vous 2 :)

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

10 nov. 2007, 12:32

Un lien pour la modélisation merise
De cette manière on évite les redondances dans la table avec 7 champs "entrainement".
Tu peux ajouter un champ "jour" dans la table intermédiaire pour repérer à quel jour appartien l'entrainement.

L'autre lien a sauté :lol:
Je le remet ICI

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 206 Messages

10 nov. 2007, 13:15

Merci je regarde ça dans la soirée et je te tiens au courant :)

J'avais déja fais une approche de la méthode mérise par ce lien :)
http://www.sam-mag.com/P53,53,5,55,,,default.aspx

Bonne journée

ViPHP
ViPHP | 2287 Messages

10 nov. 2007, 13:33

Calimero > Je pensais que comme ma fonction était implanté au milieu de mon code (et que la requete était au dessus...

Donc je dois le faire passer de la façon suivante
Oui, c'est une façon de faire (sans doute la plus propre). Il faut modifier la définition de ta fonction (le function( [...] ) et aussi la (ou les) ligne(s) d'appel(s) de la fonction dans ton code principal.

// La déclaration modifiée
function pardefaut($choix, $entrainement2) { [...] }


// Ailleurs dans ton code, la ligne d'appel modifiée
echo '<option value="'.$code_entrainement.'" '.pardefaut($_GET['choix'],$entrainement2).'>'..'</option>';
Une autre manière de le faire, moins propre mais parfois pratique, pourrait être de passer par les variables globales.
function pardefaut($choix) { 
global $entrainement2; // Grâce à cette ligne, $entrainement2 dans ta fonction sera identique à $entrainement2 en dehors de la fonction, c'est à dire dans le code principal de ton script.

$par_defaut = ''; 
$entrainement = 'entrainement'.$i; 
        if ($entrainement2[$entrainement] == $choix) { // Maintenant cette ligne peut fonctionner
            $par_defaut='selected="selected"'; 
        } 
return $par_defaut;  
}
Mais dans ton cas, cette deuxième façon de faire ne marcherait que si le code qui définit $entrainement2 (la requête SQL) n'est pas lui-même dans une fonction, ou dans une classe... Dans ce cas il faudrait éventuellement appliquer le même truc :-)

Un petit lien pour approfondir si le sujet t'intéresse : Les variables globales
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Eléphant du PHP | 206 Messages

14 nov. 2007, 21:25

Désolé pour le temps de réponse,
Mais depuis 3 jours net en rade -_-

Sinon j'ai rajouter entrainement2 dans ma fonction ce qui me donne le code suivant, mais toujours aucun résultat :(


<?php

$i =1;
function pardefaut($choix, $entrainement2) 
{
$par_defaut = '';
$entrainement = 'entrainement'.$i;
        if ($entrainement2[$entrainement] == $choix)
        {
            $par_defaut='selected="selected"';
        }
 

return $par_defaut; 
}

 $i= 1;
 while ( $i <= 7)
{ 



?>
Jour <?php echo $i;?> :
<br />
<?php echo " &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp" ?>
<select name="entrainement<?php echo $i;?>">
<option value="0" <?php echo pardefaut('0',$entrainement2); ?>>:: Repos ::</option>
<option value="1"<?php echo pardefaut('1',$entrainement2); ?>>Général</option>
<option value="2"<?php echo pardefaut('2',$entrainement2); ?>>Tir</option>
<option value="3"<?php echo pardefaut('3',$entrainement2); ?>>3 points</option>
<option value="4"<?php echo pardefaut('4',$entrainement2); ?>>Dribble</option>
<option value="5"<?php echo pardefaut('5',$entrainement2); ?>>Passe</option>
<option value="6"<?php echo pardefaut('6',$entrainement2); ?>>Rebond</option>
<option value="7"<?php echo pardefaut('7',$entrainement2); ?>>Contre</option>
<option value="8"<?php echo pardefaut('8',$entrainement2); ?>>Interception</option>
</select>
<br />
<?
$i++;
}
Bonne soirée

ViPHP
ViPHP | 2287 Messages

14 nov. 2007, 22:08

Sinon j'ai rajouter entrainement2 dans ma fonction ce qui me donne le code suivant, mais toujours aucun résultat :(
Tu as fait la moitié du travail ;-) Tu as préparé la fonction à recevoir un paramètre supplémentaire, ce qui est bien. Maintenant il faut envoyer ce paramètre depuis ton code principal (on appelle cela l'appel d'une fonction ), donc réaliser la même modification (puisque la variable d'arrivée a le même nom que la variable de départ) dans le bout de code que tu nous montrais au début de ce thread.
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Eléphant du PHP | 206 Messages

14 nov. 2007, 22:17

. Maintenant il faut envoyer ce paramètre depuis ton code principal (on appelle cela l'appel d'une fonction ), donc réaliser la même modification (puisque la variable d'arrivée a le même nom que la variable de départ) dans le bout de code que tu nous montrais au début de ce thread.
J'ai pas tout à fait saisi ce que tu veux dire :oops:

ViPHP
ViPHP | 2287 Messages

14 nov. 2007, 22:21

Ok, plus simple alors :

Tu nous montres une fonction. C'est très intéressant, on peut la modifier dans tous les sens... Mais toute seule, elle ne sert à rien. La fonction devient utile quand elle est appelée.

Il y a donc des lignes d'appel de cette fonction que tu ne nous montres pas. Ce sont elles que tu dois modifier de la même manière à présent. Ca doit ressembler à :
$truc = pardefaut($machin); // Ceci est un appel de ta fonction
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Eléphant du PHP | 206 Messages

14 nov. 2007, 22:32

Mais bien sur suis-je bête.

J'ai donc fais ça tout bêtement (à mon avis doit y a avoir une méthode plus propre)
<?php echo " &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp" ?>
<select name="entrainement<?php echo $i;?>">
<option value="0" <?php echo $par_defaut = pardefaut('0',$entrainement2); ?>>:: Repos ::</option>
<option value="1"<?php echo $par_defaut = pardefaut('1',$entrainement2); ?>>Général</option>
<option value="2"<?php echo $par_defaut = pardefaut('2',$entrainement2); ?>>Tir</option>
<option value="3"<?php echo $par_defaut = pardefaut('3',$entrainement2); ?>>3 points</option>
<option value="4"<?php echo $par_defaut = pardefaut('4',$entrainement2); ?>>Dribble</option>
<option value="5"<?php echo $par_defaut = pardefaut('5',$entrainement2); ?>>Passe</option>
<option value="6"<?php echo $par_defaut = pardefaut('6',$entrainement2); ?>>Rebond</option>
<option value="7"<?php echo $par_defaut = pardefaut('7',$entrainement2); ?>>Contre</option>
<option value="8"<?php echo $par_defaut = pardefaut('8',$entrainement2); ?>>Interception</option>
</select>
Mais jamais un selected=selected De retourné :(


ça trouve j'ai toujours rien compris et je m'y prends comme un manche :roll:
Modifié en dernier par Snipy le 14 nov. 2007, 22:47, modifié 1 fois.

ViPHP
ViPHP | 2287 Messages

14 nov. 2007, 22:45

C'est cela oui :) Et tu as bien modifié ce qu'il fallait. Est-ce que ça fonctionne ?

Pour la peine tu as gagné une petite simplification :
 &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp
<select name="entrainement<?php echo $i;?>"><?php
// La liste des entrainements. Si on ne le précise pas, dans un tableau php, les index des valeurs sont des nombres entiers numérotés automatiquement à partir de 0
$liste=array(':: Repos ::','Général','Tir','3 points','Dribble','Passe','Rebond','Contre','Interception');

foreach($liste as $index=>$valeur){ // on boucle sur cette liste
  echo '<option value="'.$index.'" '.($par_defaut = pardefaut($index,$entrainement2)).'>'.$valeur.'</option>';
}
?></select>
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Eléphant du PHP | 206 Messages

14 nov. 2007, 22:51

Ah les boucle en for and Co c'est vraiment ma hantise.

Mais en tout cas c'ets clair que niveau clairté rien à redire :)
Je l'ai bien compris pas de soucis, mais de l'a a etre capable de la refaire dans un futur probleme lol.

Donc ce qui me donne ceci :
 $i= 1;


function pardefaut($choix, $entrainement2) 
{
$par_defaut = '';
$entrainement = 'entrainement'.$i;
        if ($entrainement2[$entrainement] == $choix)
        {
            $par_defaut='selected="selected"';
        }
 

return $par_defaut; 
}

 $i= 1;
 while ( $i <= 7)
{ 

?>
Jour <?php echo $i;?> :
<br />


<?php echo " &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp" ?>
<select name="entrainement<?php echo $i;?>"><?php
// La liste des entrainements. Si on ne le précise pas, dans un tableau php, les index des valeurs sont des nombres entiers numérotés automatiquement à partir de 0
$liste=array(':: Repos ::','Général','Tir','3 points','Dribble','Passe','Rebond','Contre','Interception');

foreach($liste as $index=>$valeur){ // on boucle sur cette liste
  echo '<option value="'.$index.'" "'.($par_defaut = pardefaut($index,$entrainement2)).'">'.$valeur.'</option>';
}
?></select>
<br />
<?
$i++;
}
A mon avis c'est la fonction qui foire.

J'ai du me tromper quelque prt :roll:

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

14 nov. 2007, 23:14

$entrainement2 contient quoi au final ?

on peut voir le résultat de
echo "<pre>";
print_r($entrainement2);
echo "</pre>";
vérifie que cela correspond bien à $choix que tu passes en paramètre à la fonction.

De plus
$entrainement = 'entrainement'.$i;
$i c'est quoi ?

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute