Remplir 2 listes

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Remplir 2 listes

par Florent » 08 nov. 2006, 18:11

Et bien franchement j'ai eu raison de poser la question :)

Le résultat est que cette fois-ci j'ai bien compris, que le code est plus clair et plus simple.
En plus ça fonctionne impec :)

Donc je vous remercie tous beaucoup

par Vikchill » 08 nov. 2006, 17:20

Je plussoie avec véhémence.

par Ryle » 08 nov. 2006, 17:14

Juste une remarque en passant, mais par égare pour celui qui un jour maintiendra ce code (ce qui peut très bien être toi dans 6 mois), je suis sur que tu peux trouver des noms de variables plus explicite que " $rrr " pour une ligne de résultat issue de ta base ;)

Sinon tant qu'on y est également, tu peux alléger le code en laissant en html tout ce qui ne nécessite pas de php (c'est pas toujours interessant, mais là ça le fait quand même bien ;))
<?
$sql = "SELECT village  FROM membre WHERE login='$login'"; 
$rep = mysql_query($sql); 
while ($row = mysql_fetch_array($rep))  { // $row au lieu de $rrr, c'est déjà plus parlant
  // tant qu'à faire du fetch_array, autant utiliser les noms des champs, c'est plus lisible :)
  $liste.='<option value="'. $row['village']. '">'.  $row['village']. '</option>'; 
  // pas besoin de <br /> entre des options, la nouvelle ligne est implicite
  // à noter : si la valeur est égale au libellé, il n'est pas utile de la spécifier
} 
?>

<form method="post" action="index.php?page=trans"name="tr_s2">
  <fieldset>
  &nbsp;&nbsp;
  <label>Ville source ==>&nbsp; 
    <select name='source'>
      <option value="rien">Source</option>
      <?php echo $liste; ?>
    </select>
  </label>

  &nbsp;&nbsp;
  <label>Ville destination ==>&nbsp; 
    <select name='destination'>
      <?php echo $liste; ?>
    </select>
  </label>

  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  <input class="bouton" type="submit" value="Transferer" name="tranfert" />
  </fieldset>
</form>
Bon après, c'est que du conseil hein, c'est à toi de voir si c'est interessant ou nom, mais je pense que tu y gagneras en clarté et lisibilité de ton code :)

par RilaX » 08 nov. 2006, 17:02

Ouais y a pas plus simple comme solution ... :oops:
Merki !

par iclo » 08 nov. 2006, 16:34

Tu l'initialise avant la boucle avec une valeur vide:
$liste ="";

par RilaX » 08 nov. 2006, 15:58

J'ai une toute petite question qui n'a un rapport que lointain avec ce sujet, mais dont l'exemple parfait est contenu ici.

Comment faire pour eviter ce message d'erreur : Notice: Undefined variable: liste in fichier.php on line 5 ?
Sachant que cette erreur viens de la concaténation; etant donnée qu'avant de commencer a concaterner les valeurs qui viennent de la table, la variable $liste n'existe pas.

Alors evidemment, il y a la solution de lui attribuer une valeur a la noix, mais apres elle se retrouve dans la liste cette valeur a la noix :/

Donc quelle est la solution la plus propre ?

par Vikchill » 08 nov. 2006, 15:02

Un truc comme ça:
$sql = "SELECT village  FROM membre WHERE login='$login'";
$rep = mysql_query($sql);
while ($rrr = mysql_fetch_array($rep))
	{
        	$liste.='<option value="', $rrr['0'], '">'.  $rrr['0']. '</option><br />';
	}
echo '<form method="post" action="index.php?page=trans"name="tr_s2">';

echo '<fieldset>';
echo '&nbsp;&nbsp;<label>Ville source ==>&nbsp;';
	echo "<select name='source'>";
	echo '<option value="rien">Source</option>';
	echo $liste;
	echo '</select>';
echo '</label>';
echo '&nbsp;&nbsp;<label>Ville destination ==>&nbsp;';
	echo "<select name='destination'>";
	echo $liste
	echo '</select>';
echo '</label>';
echo '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
echo '<input class="bouton" type="submit" value="Transferer" name="tranfert" />';
echo '</fieldset>';
echo '</form>'; 

par Florent » 08 nov. 2006, 13:42

Bonjour
tu peux simplement en construire un dans une variable, par concaténation successives de toutes les options
Cette méthode, j'avoue ne pas l'avoir compris.

Par-contre, la première, compris et elle fonctionne. Alors un grand merci à RilaX.

par Vikchill » 08 nov. 2006, 10:28

J'allais conseiller extactement ce que préconise iclo, tu concatènes tes deux listes dans deux variables que tu n'affiches qu'à la sortie de ton unique boucle.

par iclo » 07 nov. 2006, 22:33

Si tes deux listes sont strictement identiques, tu peux simplement en construire un dans une variable, par concaténation successives de toutes les options. Il te suffira de faire un print de cette variable pour ajouter cette deuxième liste.

Avantage, tu évites la deuxième boucle...

par Florent » 07 nov. 2006, 20:44

J'essaie ça demain et je viendrais rendre compte.
En tout cas merci bien.

par RilaX » 07 nov. 2006, 20:24

Bon, je sais pas si c'est tres propre, mais j'ai deja utilisé ce genre de technique, tu créé un compteur et un tableau dans lequel tu mets ta variable a chaque tour de boucle, et tu incremente ton compteur. Comme ca tu peux réutiliser tes variables bien rangé dans ton tableau (qui est a 2 dimensions pour le coup :
$sql = "SELECT village  FROM membre WHERE login='$login'";
$rep = mysql_query($sql);

echo '<form method="post" action="index.php?page=trans"name="tr_s2">';

echo '<fieldset>';
echo '&nbsp;&nbsp;<label>Ville source ==>&nbsp;';
        echo "<select name='source'>";
        echo '<option value="rien">Source</option>';
        $cpt=0;
        while ($rrr = mysql_fetch_array($rep)){
            //le fameux tableau
            $tab[$cpt]=$rrr;
            $cpt++;
            echo '<option value="', $rrr['0'], '">'.  $rrr['0']. '</option><br />';
        }
        //la deux methode, soit tu utilise $taille=count($tab);, mais j'suis pas sur, soit :
        $taille=$cpt-1;
        echo '</select>';
    echo '</label>';
echo '&nbsp;&nbsp;<label>Ville destination ==>&nbsp;';
        echo "<select name='destination'>";
        echo '<option value="rien">Destination</option>';
        $cpt=0;
        while ($cpt <= $taille){
            echo '<option value="', $tab[$cpt]['0'], '">'.  $tab[$cpt]['0']. '</option><br />';
            $cpt++;
        }
        echo '</select>';
    echo '</label>';
    echo '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
    echo '<input class="bouton" type="submit" value="Transferer" name="tranfert" />';
echo '</fieldset>';
echo '</form>';
y a plus qu'a ;)

edit : correction syntaxique (un ] en trop :/ )

Remplir 2 listes

par Florent » 07 nov. 2006, 19:53

Bonjour
J'aimerais remplir 2 listes différentes qui seraient alimentées par une même requête pour ne pas la faire deux fois.
$sql = "SELECT village  FROM membre WHERE login='$login'";
$rep = mysql_query($sql);

echo '<form method="post" action="index.php?page=trans"name="tr_s2">';

echo '<fieldset>';
echo '&nbsp;&nbsp;<label>Ville source ==>&nbsp;';
		echo "<select name='source'>";
		echo '<option value="rien">Source</option>';
		while ($rrr = mysql_fetch_array($rep)){
			echo '<option value="', $rrr['0'], '">'.  $rrr['0']. '</option><br />';
		}
		echo '</select>';
	echo '</label>';
echo '&nbsp;&nbsp;<label>Ville destination ==>&nbsp;';
		echo "<select name='destination'>";
		echo '<option value="rien">Destination</option>';
		while ($rrr = mysql_fetch_array($rep)){
			echo '<option value="', $rrr['0'], '">'.  $rrr['0']. '</option><br />';
		}
		echo '</select>';
	echo '</label>';
	echo '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
	echo '<input class="bouton" type="submit" value="Transferer" name="tranfert" />';
echo '</fieldset>';
echo '</form>';
Bien sûr ma deuxième boucle ne me donne rien car toutes les valeurs sont parcourues.
je ne sais pas si cela peu se remettre à 0 pour relire, question bête, je sais.
Mais je suis sûr qu'il y a moyen de ne pas refaire la requete ?
Merci d'avance.