Page 1 sur 2

listes, php et selected

Posté : 02 avr. 2006, 21:15
par Invité
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.

Posté : 02 avr. 2006, 21:22
par Cyrano
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>

Posté : 02 avr. 2006, 21:27
par Invité
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>?

Posté : 02 avr. 2006, 21:37
par Cyrano
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.

Posté : 02 avr. 2006, 21:38
par jpaul
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)

Posté : 02 avr. 2006, 22:08
par Invité
oui, c'est intéressant aussi...mais la solution de cyrano reste plus facile à lire quand il y a beaucoup de code.

Posté : 03 avr. 2006, 02:15
par Lorenzo
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 ...

Posté : 03 avr. 2006, 10:46
par Invité
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?

Posté : 03 avr. 2006, 10:55
par Tictac
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>"; 
           }

Posté : 03 avr. 2006, 11:22
par Invité
plus d'erreur, mais la liste n'est pas remplie par les résultats de la requête.

Posté : 03 avr. 2006, 11:31
par Invité
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[]

Posté : 03 avr. 2006, 12:49
par Invité
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>

Posté : 03 avr. 2006, 12:54
par Invité
je crois que dans ce cas il faut écrire le "selected' dans le innerHTML...qu'en pensez-vous?

Posté : 03 avr. 2006, 15:37
par Invité
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?

Posté : 03 avr. 2006, 15:51
par Invité
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.