Condition php sur un formulaire qui ne passe pas?

WRInaute passionné
Bonjour,

D'un côté j'ai un simple tableau nommé $pays :
Code:
$pays = array(
 'AF' => 'Afghanistan',
 'ZA' => 'Afrique du Sud',
...

De l'autre côté une variable nommé $choixdupays qui sort d'une boucle while et qui correspond à la sélection du pays enregistré précédemment par l'utilisateur.
L'utilisateur souhaite modifier certains éléments enregistrés dont le pays, je procède donc ainsi pour lui ré-afficher les données :
Code:
<select id="pays" name="pays">
<option value="">Sélectionnez votre pays</option>
<?php
foreach($pays as $nom){
	echo '<option value="'.$nom.'"';
	if(isset($_POST["pays"]) && $_POST["pays"] == $nom){ 
		echo " selected";
	} 
	elseif($choixdupays == $nom){ echo " selected"; }
	echo '>'.$nom.'</option>'."\n";
}
?>
</select>
En supposant que l'utilisateur oubli un champ du formulaire et qu'il est changé son pays, la liste prend la seconde condition en compte au lieu de la première ... pourquoi?
Si je fais :
Code:
if(isset($_POST["pays"])) echo  $_POST["pays"];
...j'ai bien la sélection de l'utilisateur mais la première condition n'est pas prise en compte :?:

C'est quoi le truc?

Merci

Edit :

Je viens de me rendre compte que la condition ne fonctionnait pas seulement si l'utilisateur sélectionnait dans la liste un pays qui se trouve au dessus de son choix précédent ... la je ne pige pas 8O
 
WRInaute occasionnel
C'est normal, tu parses ton tableau, à chaque valeur du tableau, tu vérifies s'il est égal au POST ET à la variable $choixdupays !

Si tu veux que ton select affiche la valeur du POST, commence par faire un :
$choixdupays = $_POST['pays'];
 
WRInaute passionné
La variable $choixdupays sort d'une boucle while et correspond au choix enregistré précédemment par l'utilisateur.
Si je veut comparer la valeur du POST aux éléments de la boucle foreach, il faut bien que j'utilise le nom du select soit $_POST["pays"] .. non ?
 
WRInaute passionné
Faudrait revoir ton if/elseif, parce que dans le 1er cas tu echo selected, et dans le 2ème cas tu... echo selected, problème de conception

Code:
if ( (isset($_POST['pays']) && ($_POST['pays'] == $nom)) || ($choixdupays == $nom) ) {
      echo " selected";
   }
 
WRInaute occasionnel
Volontairement, j'ai affecté une valeur à mon POST et une valeur à mon $choixpays pour te montrer ce que fait la boucle :

Code:
<?php
	$choixdupays = 'Afrique du Sud';
	$_POST["pays"] = 'Afghanistan';
	$pays = array(
	'AF' => 'Afghanistan',
	'ZA' => 'Afrique du Sud'
	);
	 
	foreach($pays as $nom){
	   echo '<option value="'.$nom.'"';
	   if(isset($_POST["pays"]) && $_POST["pays"] == $nom){ 
	      echo " selected";
	   } 
	   elseif($choixdupays == $nom){ echo " selected"; }
	   echo '>'.$nom.'</option>'."\n";
	}
?>

en sorti, je vais avoir :

Code:
<option value="Afghanistan" selected>Afghanistan</option>
<option value="Afrique du Sud" selected>Afrique du Sud</option>

J'ai deux valeurs "selected" dans mon select ! Naturellement HTML prend la dernière selected !
 
WRInaute passionné
Ok, j'y voit un peut plus claire :mrgreen: et j'ai eu beaucoup de mal à comprendre la logique..

@lambi521 : J'ai testé votre solution et ça donne le même résultat décrit par le dernier poste de @p0k3, à savoir 2 "selected". Pour résoudre ce problème, j'ai procédé de la façon suivante, dite-moi ce que vous en pensez :
Code:
<?php
foreach($pays as $nom){
	echo '<option value="'.$nom.'"';
	//Si POST existe et différent de ce qu'il y a en BD
	if(isset($_POST["pays"]) && $_POST["pays"] != $choixdupays){
	//$selection vaut POST
		$selection = $_POST["pays"];
	}
	//Sinon $selection vaut ce qu'il y a en BD
	else{
		$selection = $choixdupays;
	}
	//Si $selection existe et est strictement égal à la valeur du formulaire
	if(isset($selection) && $selection == $nom){ 
		echo " selected";
	} 
	echo '>'.$nom.'</option>'."\n";
}
?>
 
Discussions similaires
Haut