listes, php et selected

Invité
Invité n'ayant pas de compte PHPfrance

02 avr. 2006, 21:15

Bonjour,
J'utilise des listes déroulantes pour afficher des données dans un formulaire, à partir d'une base de données.
Les listes doivent afficher le bon élément, en accord avec ce qu'il y a dans la bdd.

Actuellement, j'utilise une variable $etat qui vaut "selected" ou "", comme ceci
echo "<select name='Maliste'>";
echo "<option". $etat_bleu . ">bleu</option>";
echo "<option". $etat_rouge . ">rouge</option>";
echo "<option". $etat_rouge  . ">jaune</option>";
echo "</select>";
je suis obligé de tester chaque résultat de la requête pour savoir
quel élément de la liste activer:
if ($resultat_sql=="bleu")  $etat_bleu ="selected" else $etat_bleu="";
if ($resultat_sql=="rouge")  $etat_rouge  ="selected" else $etat_rouge="";
if ($resultat_sql=="jaune")  $etat_jaune  ="selected" else $etat_jaune="";
Vous vous doutez que c'est long et fatiguant. ça me donne envie de faire
echo "<select name='Maliste' selected='" . $resultat_sql . "'>";
echo "<option>bleu</option>";
echo "<option>rouge</option>";
echo "<option>jaune</option>";
est-ce possible? ou connaissez vous des astuces pour raccourcir le code de la liste?
Merci pour vos réponses.

Mammouth du PHP | 19672 Messages

02 avr. 2006, 21:22

Mouais, on peut simplifier :
<?php
$etat_bleu  = ($resultat_sql=="bleu")  ? " selected" : null;
$etat_rouge = ($resultat_sql=="rouge") ? " selected" : null;
$etat_jaune = ($resultat_sql=="jaune") ? " selected" : null;
?>
<select name='Maliste'>
  <option<?php echo($etat_bleu); ?>>bleu</option>
  <option<?php echo($etat_rouge); ?>>rouge</option>
  <option<?php echo($etat_jaune); ?>>jaune</option>
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Invité
Invité n'ayant pas de compte PHPfrance

02 avr. 2006, 21:27

oui, c'est pas mal ça...mais ça veut dire qu'on ne peut pas éviter le test de chaque résultat? par exemple, est-ce qu'on peut déterminer quel élément sera activé dans la balise <select>?

Mammouth du PHP | 19672 Messages

02 avr. 2006, 21:37

Soit tu fais le test avant, soit tu devras le faire dans la balise option, mais dans un cas comme dans l'autre, tu devras tester pour chaque option.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 451 Messages

02 avr. 2006, 21:38

Qu'est ce que tu penses de ça ?
<?php
reset($_POST);
while (list($key, $val) = each($_POST )) {
	echo "<BR>$key -> $val";
	$$key=$val;
}
echo "<FORM action=";
echo $_SERVER["PHP_SELF"];
echo " method=\"post\">";

$etat=array("bleu", "rouge", "vert");
echo "<select name='Maliste'>";
reset($etat);
foreach($etat as $key => $val) {
	echo "<option ". $val;
	if ($_POST['Maliste'] == $val) {echo " selected";} 
	echo ">".$val."</option>";
}
//echo "<option". $etat_bleu . ">bleu</option>";
//echo "<option". $etat_rouge . ">rouge</option>";
//echo "<option". $etat_rouge  . ">jaune</option>";
echo "</select>";
echo "<BR><INPUT TYPE=submit>";
echo "</form>"
?>
(La reaffectation des variables de $_POST du début n'est pas utile ici...)

et on peut simplifier le foreach :
foreach($etat as $key => $val)
en :
foreach($etat as $val)
Jpaul
J'essaye d'aider : parfois je fais des erreurs, on me les corrige et j'apprends un peu plus. Super ce forum :)

Invité
Invité n'ayant pas de compte PHPfrance

02 avr. 2006, 22:08

oui, c'est intéressant aussi...mais la solution de cyrano reste plus facile à lire quand il y a beaucoup de code.

Eléphant du PHP | 254 Messages

03 avr. 2006, 02:15

ben les gars ... :?:
vous avez completement zappé les variables dynamiques alors qu'elles seraient parfaites !

l'idée est juste de refaire ce que propose jpaul avec elles ...

Invité
Invité n'ayant pas de compte PHPfrance

03 avr. 2006, 10:46

bonjour,
j'essaye de construire une liste avec les éléments donnés plus haut mais j'obtiens l'erreur:
Fatal error: Cannot use [] for reading in c:\
voici ma liste déroulante, avec selected placé sur le bon élément:
//valeur devant être sélectionnéé (résultat venant de la bdd)
$valeur="..."

//création de la liste à partir d'une requête
$query  = "SELECT Champ FROM Table ORDER BY Champ ASC";      
$result = mysql_query ($query);
while($row=mysql_fetch_array($result)) { 
		$etat[]=($row["champ"]==$valeur) ? "selected" : null;
		echo "<option " . $etat[] . "value='".$row["Champ"]."'>".$row["Champ"]."</option>";
}
L'erreur semble venir du tableau $etat[], le reste fonctionne
Voyez vous ce qui ne va pas?

Eléphant du PHP | 353 Messages

03 avr. 2006, 10:55

Voir remarque en jaune
//valeur devant être sélectionnéé (résultat venant de la bdd) 
$valeur="..." 

//création de la liste à partir d'une requête 
$query  = "SELECT Champ FROM Table ORDER BY Champ ASC";       
$result = mysql_query ($query);
$nb_result = mysql_num_rows($result);

///////////////////////////////////////////////////////// 
//Definis etat comme nouvel array avant//////////
////////////////////////////////////////////////////////

$etat = array() ;
for($i=0;$i<$nb_result;$i++)
          {
         $row=mysql_fetch_array($result) ;       
         $etat[$i]=($row["champ"]==$valeur) ? "selected" : null; 
         echo "<option " . $etat[] . "value='".$row["Champ"]."'>".$row["Champ"]."</option>"; 
           }

Invité
Invité n'ayant pas de compte PHPfrance

03 avr. 2006, 11:22

plus d'erreur, mais la liste n'est pas remplie par les résultats de la requête.

Invité
Invité n'ayant pas de compte PHPfrance

03 avr. 2006, 11:31

une petite erreur dans le code ci dessus à la derniere ligne:
 echo "<option " . $etat[] . "value='".$row["Champ"]."'>".$row["Champ"]."</option>"; 
il faut mettre $etat[$i] et pas $etat[]

Invité
Invité n'ayant pas de compte PHPfrance

03 avr. 2006, 12:49

par contre ça fonctionne quand ont fait ceci:
$i=0;
while($row=mysql_fetch_array($result)) {
.....
$i++;
}
sinon encore plus dur.cette fois c'est un liste déroulante remplie par un innerHTML... la comment déterminer l'élément à sélectionner(etat)?
<div id='MaListe'>
<select id="MaListe" name='MaListe' 
<option value='-1'>_</option>
</select>
</div>

Invité
Invité n'ayant pas de compte PHPfrance

03 avr. 2006, 12:54

je crois que dans ce cas il faut écrire le "selected' dans le innerHTML...qu'en pensez-vous?

Invité
Invité n'ayant pas de compte PHPfrance

03 avr. 2006, 15:37

j'ai réussi à écrire un code qui permet d'insérer un 'selected' dans une liste générée par innerHTML avec l'exemple ci-dessus.

Mais un autre problème:
Le selected ne devient actif qu'après une action sur la liste...comment faire pour que ça se fasse au chargement de la page?

Invité
Invité n'ayant pas de compte PHPfrance

03 avr. 2006, 15:51

je m'explique:
dans une fonction, je fais une requête pour déterminer quelle valeur de la liste doit être sélectionnée.
je met le html de la liste (avec le bon selected) dans la page grâce à innerHtml=>Maliste.
ça marche car quand je fais alert(Maliste), je reçois le code html de ma liste et le "selected" au bon endroit.

Mon problème: ce selected est donc bien écrit dans la page mais il ne fonctionne qu'après une action, et pas au premier affichage de la page.