Listes déroulantes à choix multiple

Eléphant du PHP | 179 Messages

19 sept. 2005, 15:21

Normalement ce serait la seconde possibilité. Lorsque tu parles des libellés, tu intègres toutes les valeurs dans un seul champ type SET ou bien tu crées un champ à chaque fois?
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

19 sept. 2005, 15:48

pour éviter de devoir refaire du code, la requete devrai donner le résultat attendu, je pense (jamais utilisé ce type -> SET):
$requete = "INSERT INTO societes VALUES('','".$NomSociete."', '".$AutreNomSociete."','".$IdGroupe."','";

if (!empty ($tabSpecialite)){
    foreach($tabSpecialite as $cle => $valeur)
              {
              $requete.=$valeur.',';
              }
        }
$requete = substr($requete, 0, -1);    
$requete .="',".$Presentation."', '".$InfCompl."', '".$PaysOrigine."','".$Adresse."', '".$Tel."', '".$Fax."', '".$SiteSociete."',    '".$NomReprFr."', '".$AdresseReprFr."', '".$TelReprFr."', '".$FaxReprFr."', '".$MAJ."')";
et si c'est toujours pas ça, je me retire :wink:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

19 sept. 2005, 15:49

non une valeur par champ

ex : la société Batigro est de type Editeur et Producteur
tu auras ça :

Code : Tout sélectionner

Societes ------------ IdSociete | NomSociete 1 | Batigro possede --------- IdSociete | id_specialite 1 | 1 1 | 3 Specialites ------------ id_specialite | libelle_specialite 1 | Editeur 2 | Diffuseur-Distributeur 3 | Producteur

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

19 sept. 2005, 15:52

mais bon effectivement maintenant que c'est fait, et si tu n'as pas le temps de changer, garde tes SET, mais à mon avis la conception est pas top ;)

regarde dans la doc, et essayes avec les boucles de Truc
les valeurs doivent être séparées par des virgules, et a priori un groupe de valeurs doit être entouré de guillemets

Eléphant du PHP | 179 Messages

20 sept. 2005, 09:31

pour éviter de devoir refaire du code, la requete devrai donner le résultat attendu, je pense (jamais utilisé ce type -> SET):

et si c'est toujours pas ça, je me retire Wink
Non tu n'auras pas à faire ça :P , elle fonctionne. Il faut juste que je comprenne pourquoi le champ "Producteur" refuse de s'afficher quand je le sélectionne. En effet, il m'écrit:
INSERT INTO societes VALUES('','TEST3', '','','Diffuseur-Distributeur,Producteu','', '', '', '', '', '', '','', '', '', '', '')
J'ai vérifié dans le script de formulaire et dans la base si ce n'est pas une question d'orthographe mais ça n'a pas l'air d'être ça. Bô j'arriverai bien à trouver.
mais bon effectivement maintenant que c'est fait, et si tu n'as pas le temps de changer, garde tes SET, mais à mon avis la conception est pas top Wink
Après une nuit de réflexion, je me dis que j'aurai probalement moins de difficultés à utiliser cette méthode: je pense que c'est un peu long à mettre en place mais que ça sera au final beaucoup plus simple (surtout si tu m'aides :lol: ) . Néanmoins, comme je ne suis pas la seule à décider (je touche quand même à la conception), je vais demander un peu autour de moi. :wink:

Merci à tous les deux. :agenouille: Vous m'avez été d'une grande aide.
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Eléphant du PHP | 179 Messages

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);
}
?>
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

22 sept. 2005, 13:43

c'est pas idiot :)

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

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

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Invité
Invité n'ayant pas de compte PHPfrance

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);	
	}
?>

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

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

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

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:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 179 Messages

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).
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Eléphant du PHP | 179 Messages

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>
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

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

Invité
Invité n'ayant pas de compte PHPfrance

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.