Page 1 sur 5

Listes déroulantes à choix multiple

Posté : 14 sept. 2005, 16:24
par Elisa
Bonjour à tous,

Je voudrais savoir, lorsqu'on a des listes déroulantes à choix multiples dans un formulaire, comment on fait pour que les choix multiples soient pris en compte dans la base. en gros comment ça se passe côté script PHP?

J'ai cherché sur Internet de la doc mais je n'ai pas compris. Quelqu'un pourrait-il m'expliquer?

Merci par avance.

Posté : 14 sept. 2005, 16:26
par Vaedan
le meilleur moyen est d'en programmer une, de soumettre le formulaire, et de faire :
print_r( $_POST );
;)

Posté : 14 sept. 2005, 16:31
par ouckileou
avec une liste déroulante à choix multiples tu peux récupérer un tableau
il suffit donc à réception de boucler sur ce tableau et de construire une requête dynamiquement, ou d'en exécuter une à chaque tour de boucle, suivant la structure des tables à alimenter

tu as un exemple pour récupérer les valeurs dans la FAQ :
http://www.phpfrance.com/forums/voir_sujet-5220.php

Posté : 14 sept. 2005, 17:07
par Elisa
Plus concrètement j'ai un formulaire qui se présente ainsi:
<!--Formulaire-->
		<form action="test_add_soc2.php" method="post">


<!--Tableau d'affichage des champs du formulaire-->
<table>

<tr>
	<td><h4>Nom de la société :</h4></td>
	<td><input type="text" name="NomSociete" size=50></td>
</tr>


<tr>
	<td><h4>Autre nom de la société : </h4></td>
	<td><input type="text" name="AutreNomSociete" size=50></td>
</tr>


<tr>
	<td><h4>Groupe :</h4></td>
	<td><select name="IdGroupe">
			<option value="">
<?php
//Connection à la base//
	$lien = mysql_connect("xx","xx","xx");
	mysql_select_db("xx", $lien);

//Sélection de la table groupe//
	$requete="SELECT * FROM groupes";
	$result=mysql_query($requete);

// Tant qu'il y a des données dans le tableau, on le parcourt//
while ($val=mysql_fetch_array($result))
	{
	print ('<option value="'.$val["IdGroupe"].'">');
	print ($val["NomGroupe"]);
	}
//Fermeture de la base//
	mysql_close($lien);
?>

	</select></td>
</tr>

<tr>
	<td><h4>Spécialité de la société : </h4></td>
	<td><select name="Specialite[]" size="3" multiple>
	<option value="Editeur">Editeur</option>
	<option value="Diffuseur-Distributeur">Diffuseur-Distributeur</option>
	<option value="Producteur">Producteur</option>
	</select></td>
</tr>


<tr>
	<td><h4>Présentation : </h4></td>
	<td><textarea name="Presentation" rows="8" cols="50"></textarea></td>
</tr>

<tr>
	<td><h4>Informations complémentaires : </h4></td>
	<td><textarea name="InfCompl" rows="8" cols="50"></textarea></td>
</tr>

<tr>
	<td><h4>Pays d'origine : </h4></td>
	<td><input type="text" name="PaysOrigine" size=50></td>
</tr>

<tr>
	<td><h4>Coordonnées : </h4></td>
</tr>

<tr>
	<td>Adresse : </td>
	<td><textarea name="Adresse" rows="3" cols="35"></textarea></td>
</tr>

<tr>
	<td>Téléphone : </td>
	<td><input type="text" name="Tel" size=14></td>
</tr>

<tr>
	<td>Fax : </td>
	<td><input type="text" name="Fax" size=14></td>
</tr>

<tr>
	<td><h4>Site de la société : </h4></td>
	<td><input type="text" name="SiteSociete" size=50></td>
</tr>

<tr>
	<td><h4>Nom du représentant en France : </h4></td>
	<td><input type="text" name="NomReprFr" size=50></td>
</tr>

<tr>
	<td><h4>Coordonnées du représentant en France : </h4></td>
</tr>

<tr>
	<td>Adresse : </td>
	<td><textarea name="AdresseReprFr" rows="3" cols="35"></textarea></td>
</tr>

<tr>
	<td>Téléphone : </td>
	<td><input type="text" name="TelReprFr" size=14></td>
</tr>

<tr>
	<td>Fax : </td>
	<td><input type="text" name="FaxReprFr" size=14></td>
</tr>

<tr>
	<td>Dernière mise à jour : </td>
	<td><input type="text" name="MAJ" size=8></td>
</tr>

</table>

<br><center><input type="submit" value="Enregistrer"></center>

		</form>
	</body>
</html>
J'ai un script d'enregistrement qui se présente ainsi:
<?php
//Récupération des données du formulaire//
$NomSociete = $_POST['NomSociete'];
$AutreNomSociete = $_POST['AutreNomSociete'];
$IdGroupe = $_POST['IdGroupe'];
$Specialite = (isset ($_POST['Specialite']))?$_POST['Specialite']:null;
$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."','".$Specialite."', '".$Presentation."',
	'".$InfCompl."', '".$PaysOrigine."', '".$Adresse."', '".$Tel."', '".$Fax."', '".$SiteSociete."',
	'".$NomReprFr."', '".$AdresseReprFr."', '".$TelReprFr."', '".$FaxReprFr."', '".$MAJ."')";
//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);
	}
?>

<h3><center>Retourner au <a href="../administration_sommaire.html" > sommaire</a></center></h3>

	</body>
</html>
Et si je comprends bien, je dois rajouter un morceau de code (je ne sais pas où) qui ressemblerait à ça?
if(isset($enregistrer))
	{
	foreach ($Specialite as $Choix)
		{
		echo ($Choix)
		}
	}
//Fermeture de la base//
mysql_close($lien);

Posté : 14 sept. 2005, 17:32
par ouckileou
oui, avec ce bout de code tu afficheras les spécialités choisies par l'utilisateur
tu places ce bout de code à réception du formulaire, c'est du traitement de données transmises, comme un champ texte.

Posté : 14 sept. 2005, 17:38
par Elisa
A réception du questionnaire, c'est quand je récupère les données du formulaires? Avant de commencer ma requête?

Posté : 14 sept. 2005, 17:40
par ouckileou
ben oui...

tu as ton formulaire, quand tu cliques sur le bouton -> ça renvoie vers un script qui récupère les données

donc ce code boucle sur le tableau transmis par la liste déroulante, à toi d'en faire ce que tu veux :)

Posté : 14 sept. 2005, 17:45
par Elisa
J'ai tenté la chose, et ça ne me donne ... rien! Pas de message d'erreur mais pas non plus d'enregistrement dans la base...

Posté : 14 sept. 2005, 17:55
par ouckileou
on est bien d'accord j'espère, ce code :
if(isset($enregistrer))
    {
    foreach ($Specialite as $Choix)
        {
        echo ($Choix)
        }
    } 
ne fera qu'afficher la liste des spécialités choisies, la liste des <option> sur lesquelles a cliqué l'utilisateur

il n'a jamais été question d'enregistrement en base de données

c'est à toi à partir de ces données de construire ta requête, suivant le schéma de ta table

comment fais-tu ça ?

Posté : 15 sept. 2005, 11:32
par Elisa
Je suis indécrotable :lol: :lol:
Bon, comment fait-on alors si on veut enregistrer les données transmises par une liste déroulante à choix multiple? Si tu as un exemple concret, peut-être que je pourrais me dépatouiller avec?

p.s: A propos, comme promis, tu as eu une mention spéciale pour mon mémoire :wink:

Posté : 15 sept. 2005, 14:06
par ouckileou
Voici un exemple car cela dépend de la structure de ta table

Je reprend l'exemple de la FAQ, on imagine qu'on stocke les langages choisis dans le profil d'un nouvel utilisateur, dans un même champs (ce n'est pas bien mais c'est pour l'exemple)
Je vais concaténer les valeurs, construire ma requête et l'exécuter à la fin
$requete = "INSERT INTO profil (nom, prenom, langages) VALUES ('".$nom."', '".$prenom."',";
if (!empty($tabLangages)) {
    foreach($tabLangages as $cle => $valeur) {
        $requete .= "'".$valeur."', ";
    }
}
// on enlève l'espace et la virgule en trop
$requete = substr($requete, 0, -2);
// on exécute
mysql_query($requete);
mais on aurait pu avoir besoin de faire une requête pour chaque valeur, pour créer des relations entre deux tables par exemple
p.s: A propos, comme promis, tu as eu une mention spéciale pour mon mémoire :wink:
:lol: super et t'as eu combien ?

Posté : 15 sept. 2005, 15:02
par Invité
Ah je me suis plantée: j'ai édité au lieu de répondre. Je dois l'intégrer à ma requête principale ou bien faire une requête à part?

Pour le mémoire je le rends demain et je soutiens le 27. Si j'ai plus de 14, tu pourras voir la dédicace en ligne :P .

Posté : 15 sept. 2005, 15:16
par ouckileou
Ah je me suis plantée: j'ai édité au lieu de répondre. Je dois l'intégrer à ma requête principale ou bien faire une requête à part?
ça, ça dépend du schéma de la table, de ce que les données représentent

Posté : 15 sept. 2005, 15:30
par Elisa
Ma requête initiale était:
$requete = "INSERT INTO societes VALUES('','".$NomSociete."', '".$AutreNomSociete."','".$IdGroupe."','".$Specialite."', '".$Presentation."',
    '".$InfCompl."', '".$PaysOrigine."', '".$Adresse."', '".$Tel."', '".$Fax."', '".$SiteSociete."',
    '".$NomReprFr."', '".$AdresseReprFr."', '".$TelReprFr."', '".$FaxReprFr."', '".$MAJ."')"; 
Est-ce que j'ai le droit d'écrire:
$requete = "INSERT INTO societes VALUES('','".$NomSociete."', '".$AutreNomSociete."','".$IdGroupe."',";

if (!empty ($tabSpecialite)){
    foreach($tabSpecialite as $cle => $valeur){
       $requete.="'".$valeur."',";
       }
}

  , '".$Presentation."',
    '".$InfCompl."', '".$PaysOrigine."', '".$Adresse."', '".$Tel."', '".$Fax."', '".$SiteSociete."',
    '".$NomReprFr."', '".$AdresseReprFr."', '".$TelReprFr."', '".$FaxReprFr."', '".$MAJ."')";
Questions:
1. Qu'est ce que je fais du reste de ma requête?
2. Dans ton exemple la parenthèse des values n'est pas fermée :c'est juste une erreur ou c'est voulu? Si c'est voulu: pourquoi?
3.
// on enlève l'espace et la virgule en trop
$requete = substr($requete, 0, -2); 
C'est quoi cet espace et cette virgule? C'est à l'affichage?

Posté : 15 sept. 2005, 16:13
par Elisa
J'ai vu qu'il y avait un topique similaire au mien. Il ne répond pas à mes questions mais il me donne une première orientation. J'ai regardé les réponses et j'ai fait une tentative plus ou moins avortée. Je suis sur la bonne piste?
<?php
//Récupération des données du formulaire//
$NomSociete = $_POST['NomSociete'];
$AutreNomSociete = $_POST['AutreNomSociete'];
$IdGroupe = $_POST['IdGroupe'];
$Specialite = (isset ($_POST['Specialite']))?$_POST['Specialite']:null;
$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."',";

if (!empty ($tabSpecialite)){
    foreach($tabSpecialite as $cle => $valeur)
              {
              $requete.="'".$valeur."',";
              }
        } 
$requete = substr($requete, 0, -2); 	
$requete .= ')';
"('".$Presentation."', '".$InfCompl."', '".$PaysOrigine."', '".$Adresse."', '".$Tel."', '".$Fax."', '".$SiteSociete."',
	'".$NomReprFr."', '".$AdresseReprFr."', '".$TelReprFr."', '".$FaxReprFr."', '".$MAJ."')";
 

//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);
}
?>
Il m'affiche cette erreur:
Il y a eu une erreur : Erreur de syntaxe près de '')' à la ligne 1
Dans :
INSERT INTO societes VALUES('','TEST3', '',')
// La ligne 1 c'est la balise "<html>"...