Listes déroulantes à choix multiple

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 : Listes déroulantes à choix multiple

par Invité » 28 sept. 2005, 11:50

Bonjour,

Eh bien j'ai testé. Tout fonctionne correctement. Merci beaucoup à tous les deux: j'ai encore beaucoup appris, et un peu mieux compris.

Pour nos lecteurs assidus ( :wink: ), voici comment se présente le formulaire (avec les items qui étaient sélectionnés avant modification):
<td><h4>Spécialité de la société : </h4></td>
	<td><?php $Specialite=explode (",",$Specialite);?>
	<select name="Specialite[]" size="3" multiple>
    <option value="Editeur" <? if(in_array("Editeur",$Specialite)) echo "selected" ?>>Editeur</option>
    <option value="Diffuseur-Distributeur" <? if(in_array("Diffuseur-Distributeur",$Specialite)) echo "selected" ?>>Diffuseur-Distributeur</option>
    <option value="Producteur" <? if(in_array("Producteur",$Specialite)) echo "selected" ?>>Producteur</option>
	</select></td>
Voici la requête de mise à jour:
$requete="UPDATE societes SET
NomSociete='".$NomSociete."',
AutreNomSociete='".$AutreNomSociete."',
RefGroupe='".$IdGroupe."',
Specialite= '".implode(',',$_POST['Specialite'])."', 
Presentation='".$Presentation."',
InfCompl='".$InfCompl."',
PaysOrigine='".$PaysOrigine."',
Adresse='".$Adresse."',
Tel='".$Tel."',
Fax='".$Fax."',
SiteSociete='".$SiteSociete."',
NomReprFr='".$NomReprFr."',
AdresseReprFr='".$AdresseReprFr."',
TelReprFr='".$TelReprFr."',
FaxReprFr='".$FaxReprFr."',
MAJ='".$MAJ."'
WHERE IdSociete='".$IdSociete."'";

par Truc » 23 sept. 2005, 16:53

en faite le in_array a besoin d'un tableau, hors avec ce que je t montré il n'y en a pas, glisse cette ligne avant le <select> pour que la ligne de la base de donnée donne un tableau:
$Specialite=explode (",",$Specialite);

par ouckileou » 23 sept. 2005, 16:50

J'ai une liste déroulante "Spécialité", définie dans ma base comme un champ de type SET.

1. Lorsque je veux effectuer une action sur ce champ (enregistrement, modification), j'utilise la fonction "implode" qui appelle une chaîne de caractère (celle enregistrée dans le champ SET de ma base).
implode() reconstitue une chaine, depuis un tableau
comme tu récupères un tableau, qui correspond à la liste déroulante, implode() te sert à formater la chaine pour créer la valeur du SET => OK
2. Lorsque je veux modifier un enregistrement, je voudrais que les items que j'ai choisis précédemment soient encore sélectionnés. Dans ce cas là, j'utilise la fonction "in_array" qui retourne l'item sélectionné si la condition est vraie. Les items soumis à condition sont les mêmes que ceux du champ SET dans ma base.
Non, in_array renvoie vrai, ou faux
donc ce que tu dois faire, c'est récupérer les valeurs du champ SET, les mettre dans un tableau (avec explode() par exemple) et avec in_array, vérifier pour chaque valeur de <option> si elle est dans ce tableau. Si elle l'est, on positionne la liste déroulante dessus
Et c'est là que ça bloque: il ne reconnaît pas "in_array". J'ai cherché la cause de l'erreur et j'ai supposé que c'était parce que je n'avais pas défini "array" mais c'est peut-être autre chose et je fais fausse route?
Le problème venait déjà du fait que tu définissais toi-même le tableau, or il doit contenir les valeurs contenu dans la base de données

par Invité » 23 sept. 2005, 16:15

Mais je parlais bien de la pré-sélection :? . Je pense que je mélange un peu les deux car ça fait appel au même SET (enfin si j'ai bien compris :-k ).

Je reprends (parfois ça m'aide à y voir plus clair). Dis-moi si j'ai bien compris et si je ne fais pas d'erreurs de raisonnement.

J'ai une liste déroulante "Spécialité", définie dans ma base comme un champ de type SET.

1. Lorsque je veux effectuer une action sur ce champ (enregistrement, modification), j'utilise la fonction "implode" qui appelle une chaîne de caractère (celle enregistrée dans le champ SET de ma base).

2. Lorsque je veux modifier un enregistrement, je voudrais que les items que j'ai choisis précédemment soient encore sélectionnés. Dans ce cas là, j'utilise la fonction "in_array" qui retourne l'item sélectionné si la condition est vraie. Les items soumis à condition sont les mêmes que ceux du champ SET dans ma base.

Et c'est là que ça bloque: il ne reconnaît pas "in_array". J'ai cherché la cause de l'erreur et j'ai supposé que c'était parce que je n'avais pas défini "array" mais c'est peut-être autre chose et je fais fausse route?

par ouckileou » 23 sept. 2005, 15:53

moi je parle au niveau de la pré-sélection

tu dois faire les tests avec in_array sur un tableau de valeurs récupérées de la base de données, par un tableau que tu initialises toi-même avec toutes les valeurs dedans, sinon ça ne sert à rien

(une chose à la fois ce sera mieux je pense... :lol:)

par Invité » 23 sept. 2005, 15:49

Donc si je comprends bien, je dois appliquer avec des variables.
$Specialite = array ($val1, $val2, $val3);
Dans ce cas là, comment est-ce que je les définis? Dans le cas d'un INSERT ou même de l'UPDATE, je n'avais pas besoin de le faire puisque un champ SET= array. Or dans ce cas précis, il ne semble plus reconnaître l'"array" puisqu'il n'applique pas in_array.

par ouckileou » 23 sept. 2005, 15:10

normal, si tu définies toi-même le tableau, avec toutes les valeurs, tous les tests seront vrais, donc ils sélectionneront tous les items

tu dois faire ça sur les valeurs récupérées dans la base de données

par Elisa » 23 sept. 2005, 14:54

Bon je crois que j'ai repéré mon erreur: je n'ai pas défini "array". Je pense qu'il faut que je place ceci
$Specialité = array ('Editeur', 'Diffuseur-Distributeur','Producteur');
Mais je ne sais pas où le placer. Lorsque je le place comme suit il m'affiche tous les items comme sélectionnés et pas ceux que j'ai sélectionnés spécifiquement.
<td><h4>Spécialité de la société : </h4></td>
	<td><select name="Specialite[]" size="3" multiple <? $Specialité = array ('Editeur', 'Diffuseur-Distributeur','Producteur');?>>
    <option value="Editeur" <? if(in_array("Editeur",$Specialite)) echo "selected" ?>>Editeur</option>
    <option value="Diffuseur-Distributeur" <? if(in_array("Diffuseur-Distributeur",$Specialite)) echo "selected" ?>>Diffuseur-Distributeur</option>
    <option value="Producteur" <? if(in_array("Producteur",$Specialite)) echo "selected" ?>>Producteur</option>
	</select></td>

par Elisa » 23 sept. 2005, 13:51

Le code de la requête UPDATE a l'air bon, mais pourquoi tu n'as pas remis ton implode() du coup ? c'est le même système
Ben parce que je l'avais (mal) fait. :oops:
En ce qui concerne le 2eme probleme tu fait une erreur en nomant le select:

PHP:
<select name="Specialite"[]"

essaie comme ceci:
PHP:
<select name="Specialite[]"
Ben je crois que le problème venait de là. J'avais bêtement conclu que c'était le implode qui ne fonctionnait pas... :oops:
Mais bon, voila ce qui devrai réglé ton problème de préséléction dans la liste:
Ce code remplace le select que tu as mis.
PHP:
<select name="Specialite[]" size="3" multiple>
<option value="Editeur" <? if(in_array("Editeur",$Specialite)) echo "selected" ?>>Editeur</option>
<option value="Diffuseur-Distributeur" <? if(in_array("Diffuseur-Distributeur",$Specialite)) echo "selected" ?>>Diffuseur-Distributeur</option>
<option value="Producteur" <? if(in_array("Producteur",$Specialite)) echo "selected" ?>>Producteur</option>
</select>
Du coup je découvre une nouvelle fonction (in_array). Ceci dit il me donne une erreur que je n'ai encore jamais rencontrée:
Warning: in_array():Wrong datatype for secund argument
et le meme principe que t'a montré cet informaticien
pour le UPDATE Wink
:lol: Ce que je voulais dire, c'est qu'avant de modifier toute la conception, il fallait que ça se fasse en accord avec mon "entourage professionnel" (donc j'ai demandé son avis à l'informaticien qui m'a proposé cette alternative).

par Truc » 23 sept. 2005, 13:15

Salut, tu aurrai due changer de post :wink:
Mais bon, voila ce qui devrai réglé ton problème de préséléction dans la liste:
Ce code remplace le select que tu as mis.
<select name="Specialite[]" size="3" multiple>
    <option value="Editeur" <? if(in_array("Editeur",$Specialite)) echo "selected" ?>>Editeur</option>
    <option value="Diffuseur-Distributeur" <? if(in_array("Diffuseur-Distributeur",$Specialite)) echo "selected" ?>>Diffuseur-Distributeur</option>
    <option value="Producteur" <? if(in_array("Producteur",$Specialite)) echo "selected" ?>>Producteur</option>
</select>
En ce qui concerne le 2eme probleme tu fait une erreur en nomant le select:
<select name="Specialite"[]" 
essaie comme ceci:
<select name="Specialite[]" 
et le meme principe que t'a montré cet informaticien
pour le UPDATE :wink:

par ouckileou » 23 sept. 2005, 13:11

Pour prépositionner une liste déroulante, tu trouveras un sujet dans la FAQ

Le code de la requête UPDATE a l'air bon, mais pourquoi tu n'as pas remis ton implode() du coup ? c'est le même système

par Invité » 23 sept. 2005, 10:03

Dîtes, si vous croyez que j'ai trouvé ça toute seule... :lol: :lol: Nan nan, c'est un informaticien qui m'a mise sur la piste. Après, c'est vrai j'ai fait quelques recherches sur la fonction et j'ai adapté O:)

Ca marche très bien pour le INSERT mais j'avoue que je ne sais pas comment m'y prendre pour un UPDATE. Apparemment, ça ne fonctionne pas de la même façon. J'ai passé la journée d'hier à tenter différentes approches. Mais je pense que des éléments me manquent.

Par ailleurs, lorsque je veux modifier un enregistrement, j'ai toujours le souci de la liste déroulante: elle se réinitialise au lieu de rester là où elle a été sélectionnée. Je pense que les deux problèmes doivent être liés. Qu'en pensez-vous?

Je vous transmets le script originel, si vous pouviez m'orienter, je vous serai éternellement reconnaissante :agenouille:

Voici mon formulaire (une partie du moins) pour modifier l'enregistrement :

<?php
//Récupération de l'identifiant de l'enregistrement//
$IdSociete = $_POST['IdSociete'];
?>

<!--Formulaire-->
			<form action="b_societes_mod3.php" method="post">

<!--Récupération du champ caché-->
<input type="hidden" name="IdSociete" value="<? echo $IdSociete; ?>">

<?php
//Connection à la base//
	$lien = mysql_connect("xx","xx","xx");
	mysql_select_db("xx", $lien);

//Sélection de la table//
	$requete="SELECT IdSociete, NomSociete, AutreNomSociete, RefGroupe, Specialite, Presentation,
	InfCompl, PaysOrigine, Adresse, Tel, Fax, SiteSociete, NomReprFr, AdresseReprFr, TelReprFr, FaxReprFr, MAJ
	FROM societes 
	WHERE IdSociete='".$IdSociete."'";
	$result=mysql_query($requete);

//Affichage des données du tableau//
$NomSociete=mysql_result($result,0,'NomSociete');
$AutreNomSociete=mysql_result($result,0,'AutreNomSociete');
$RefGroupe=mysql_result($result,0,'RefGroupe');
$Specialite=mysql_result($result,0,'Specialite');
$Presentation=mysql_result($result,0,'Presentation');
$InfCompl=mysql_result($result,0,'InfCompl');
$PaysOrigine=mysql_result($result,0,'PaysOrigine');
$Adresse=mysql_result($result,0,'Adresse');
$Tel=mysql_result($result,0,'Tel');
$Fax=mysql_result($result,0,'Fax');
$SiteSociete=mysql_result($result,0,'SiteSociete');
$NomReprFr=mysql_result($result,0,'NomReprFr');
$AdresseReprFr=mysql_result($result,0,'AdresseReprFr');
$TelReprFr=mysql_result($result,0,'TelReprFr');
$FaxReprFr=mysql_result($result,0,'FaxReprFr');
$MAJ=mysql_result($result,0,'MAJ');

mysql_close($lien);
?>	

Spécialité de la société : // Ici il faudrait : 1. que je puisse restituer la liste déroulante déjà sélectionnée, 2. que je puisse transmettre les nouvelles données s'il y a eu changement
<select name="Specialite"[]" size="3" multiple>
	<option value="Editeur">Editeur</option>
	<option value="Diffuseur-Distributeur">Diffuseur-Distributeur</option>
	<option value="Producteur">Producteur</option>
</select>
Voici le second script, qui est censé effectuer la modification:
<?php 
//Récupération des données du formulaire//
$IdSociete = $_POST['IdSociete'];
$NomSociete = $_POST['NomSociete'];
$AutreNomSociete = $_POST['AutreNomSociete'];
$IdGroupe = $_POST['IdGroupe'];
$Specialite = $_POST['Specialite'];
$Presentation = $_POST['Presentation'];
$InfCompl = $_POST['InfCompl'];
$PaysOrigine = $_POST['PaysOrigine'];
$Adresse = $_POST['Adresse'];
$Tel = $_POST['Tel'];
$Fax = $_POST['Fax'];
$SiteSociete = $_POST['SiteSociete'];
$NomReprFr = $_POST['NomReprFr'];
$AdresseReprFr= $_POST['AdresseReprFr'];
$TelReprFr = $_POST['TelReprFr'];
$FaxReprFr = $_POST['FaxReprFr'];
$MAJ = $_POST['MAJ'];



//Si le champ "Nom" n'est pas complété//
if(!$NomSociete)
	{
	print("<h3><center>Vous n'avez pas rempli le champ nom</h3></center>");
	}

//Sinon confirmer la modification//
else 
	{
//connection à la base//
	$lien = mysql_connect("xx","xx","xx");
	mysql_select_db("xx", $lien);

//requête de mise à jour//
	$requete="UPDATE societes SET
NomSociete='".$NomSociete."',
AutreNomSociete='".$AutreNomSociete."',
RefGroupe='".$IdGroupe."',
Specialite= '".$Specialite."', 
Presentation='".$Presentation."',
InfCompl='".$InfCompl."',
PaysOrigine='".$PaysOrigine."',
Adresse='".$Adresse."',
Tel='".$Tel."',
Fax='".$Fax."',
SiteSociete='".$SiteSociete."',
NomReprFr='".$NomReprFr."',
AdresseReprFr='".$AdresseReprFr."',
TelReprFr='".$TelReprFr."',
FaxReprFr='".$FaxReprFr."',
MAJ='".$MAJ."'
WHERE IdSociete='".$IdSociete."'";
	
	
$result=mysql_query($requete) or die('Il y a eu une erreur : <strong>' . mysql_error() . '</strong><br>Dans : <br>' . $requete);
	print ("<h2><center>La société a été modifiée </center></h2>");

	if (isset ($Specialite)) echo "Insertion de la spécialité: '".$Specialite."'";
//fermeture de la base//
mysql_close($lien);	
	}
?>

par Truc » 22 sept. 2005, 14:24

Super, t'a pas laché le morceau pour trouver une solution "courte". :D

On l'air de quoi nous avec les grosses boucles inutiles

par ouckileou » 22 sept. 2005, 13:43

c'est pas idiot :)

par Elisa » 22 sept. 2005, 10:19

Bonjour à tous,

Je me permets de relancer ce topic car j'ai finalement adopté une solution à mon problème complètement différente de celles qui m'ont été proposées. Beaucoup plus simpe, elle fonctionne sans problème:

Il s'agit d'utiliser la fonction "implode" en la concaténant à la requête.

<?php
//Récupération des données du formulaire//
$NomSociete = $_POST['NomSociete'];
$AutreNomSociete = $_POST['AutreNomSociete'];
$IdGroupe = $_POST['IdGroupe'];
$Specialite = $_POST['Specialite'];
$Presentation = $_POST['Presentation'];
$InfCompl = $_POST['InfCompl'];
$PaysOrigine = $_POST['PaysOrigine'];
$Adresse = $_POST['Adresse'];
$Tel = $_POST['Tel'];
$Fax = $_POST['Fax'];
$SiteSociete = $_POST['SiteSociete'];
$NomReprFr = $_POST['NomReprFr'];
$AdresseReprFr = $_POST['AdresseReprFr'];
$TelReprFr = $_POST['TelReprFr'];
$FaxReprFr = $_POST['FaxReprFr'];
$MAJ = $_POST['MAJ'];



//Si le champ "Nom" n'est pas complété//
if(!$NomSociete)
	{
	print("<h2><center>Veuillez donner un nom</center></h2>");
	}
//Sinon confirmer l'enregistrement//
else
	{
//Connection à la base//
	$lien = mysql_connect("xx","xx","xx");
	mysql_select_db("xx", $lien);
	
//Requête d'enregistrement//
	$requete = "INSERT INTO societes VALUES('','".$NomSociete."', '".$AutreNomSociete."','".$IdGroupe."','".implode(',',$_POST['Specialite'])."','".$Presentation."', '".$InfCompl."', '".$PaysOrigine."', '".$Adresse."', '".$Tel."', '".$Fax."', 
'".$SiteSociete."','".$NomReprFr."', '".$AdresseReprFr."', '".$TelReprFr."', '".$FaxReprFr."', '".$MAJ."')";

echo ($requete);
//Résultat de la requête//
	$result = mysql_query($requete) or die('Il y a eu une erreur : <strong>' . mysql_error() . '</strong><br>Dans : <br>' . $requete);
	print ("<h3><center>La société a été enregistrée</h3></center>");
//Fermeture de la base//
mysql_close($lien);
}
?>