Listes déroulantes à choix multiple

Eléphant du PHP | 179 Messages

14 sept. 2005, 16:24

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

Eléphant du PHP | 493 Messages

14 sept. 2005, 16:26

le meilleur moyen est d'en programmer une, de soumettre le formulaire, et de faire :
print_r( $_POST );
;)

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

14 sept. 2005, 16:31

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

Eléphant du PHP | 179 Messages

14 sept. 2005, 17:07

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

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

14 sept. 2005, 17:32

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.

Eléphant du PHP | 179 Messages

14 sept. 2005, 17:38

A réception du questionnaire, c'est quand je récupère les données du formulaires? Avant de commencer ma requête?
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

14 sept. 2005, 17:40

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 :)

Eléphant du PHP | 179 Messages

14 sept. 2005, 17:45

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

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

14 sept. 2005, 17:55

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 ?

Eléphant du PHP | 179 Messages

15 sept. 2005, 11:32

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

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

15 sept. 2005, 14:06

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 ?

Invité
Invité n'ayant pas de compte PHPfrance

15 sept. 2005, 15:02

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 .

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

15 sept. 2005, 15:16

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

Eléphant du PHP | 179 Messages

15 sept. 2005, 15:30

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

Eléphant du PHP | 179 Messages

15 sept. 2005, 16:13

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