PHP/MySQL : liste déroulante dynamique

Suru_Verbal Messages postés 10 Date d'inscription lundi 4 juillet 2005 Statut Membre Dernière intervention 22 juillet 2005 - 19 juil. 2005 à 16:06
Suru_Verbal Messages postés 10 Date d'inscription lundi 4 juillet 2005 Statut Membre Dernière intervention 22 juillet 2005 - 20 juil. 2005 à 16:40
Bonjour à tous !

Je réalise un petit projet en PHP avec une Base de Données MySQL.

J'utilise des formulaires et je voudrais savoir s'il est possible de récupérer les valeurs possibles d'un champ de type SET ou ENUM de la BD, afin de faire un menu déroulant proposant les diverses valeurs possibles.

Par exemple, j'ai une table dont voici le script SQL :

<TABLE cellSpacing= 0 cellPadding=0 width="80%" align=center border=0>

----, </TD>
----

<TABLE cellSpacing =0 cellPadding=2 width="100%" border=0>

----,

CREATE TABLE ma_table (
id int AUTO_INCREMENT NOT NULL,
ma_liste ENUM('choix1','choix2','choix3'),
PRIMARY KEY ( id ),
);
</TD>
</TD></TR></TBODY></TABLE>

et je voudrais alimenter une liste déroulante dans une page HTML sans avoir, au préalable, besoin de connaître le nombre de valeurs possibles de l'attribut "ma_liste" ni les valeurs possibles.

Dans ce cas, je n'ai mis que trois valeurs à "ma_liste" mais cela devient tout de suite plus gênant lorsqu'il y en a une bonne trentaine, ou lorsque l'on veut rajouter des valeurs possibles à "ma_liste", car dans ce cas il faudrait non seulement modifier la BD mais aussi le code source de la page HTML.

Je pense qu'il existe une manière de gérer cela dynamiquement...

Si quelqu'un la connaît, ce serait vraiment sympa de partager ses connaissances, car malgré mes recherches je n'ai pas encore trouvé !

Merci d'avance !</TD></TR>
<TR>
<TD height=15></TD></TR></TBODY></TABLE>/forum.v2.aspx?id=183106

10 réponses

malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
19 juil. 2005 à 16:18
hello,



utilise
SHOW COLUMNS sur ta colonne ENUM, et parse le resultat.
0
Suru_Verbal Messages postés 10 Date d'inscription lundi 4 juillet 2005 Statut Membre Dernière intervention 22 juillet 2005
19 juil. 2005 à 16:30
Merci de ta promptitude, mais "SHOW COLUMNS" s'applique à une table et non à un champ d'après la documentation... ou alors je t'ai mal compris...
0
davwart Messages postés 855 Date d'inscription mardi 19 novembre 2002 Statut Membre Dernière intervention 28 juillet 2009 1
19 juil. 2005 à 16:45
ben oui.. tu fais show columns ou "desc" sur ta table..et tu vas chercher la bonne colone ds le resultat...

puis tu parses la description
-------------------------------------
Les ordinateurs, plus on s'en sert moins, moins ça a de chance de mal marcher. [Les Shadoks]
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
19 juil. 2005 à 16:48
Heu oui, ma syntaxe ecrite a la va vite est fausse, c#est tout.

SHOW COLUMNS te montrera toutes les colonnes pour une table. Tupeux
utiliser un LIKE pour preciser une colonne. Colone. Enfin bref lol.

Il faudra ensuite parser le resultat pour recuperer uniquement ce que tu veux.



C'est marque la :




If you want to determine all possible values for an
ENUM
column, use
SHOW COLUMNS FROM
    <code>tbl_name
LIKE
enum_col
</code> and parse the
ENUM
definition in the second column of the
output.



http://dev.mysql.com/doc/mysql/en/enum.html
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Suru_Verbal Messages postés 10 Date d'inscription lundi 4 juillet 2005 Statut Membre Dernière intervention 22 juillet 2005
19 juil. 2005 à 17:24
Ok, merci pour vos réponses !

Je vais voir comment parser ça (car SHOW COLUMNS rend plusieurs champs...).

Par hasard, vous ne sauriez pas comment on fait pour ne garder qu'un seul champ ?
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
19 juil. 2005 à 17:28
Si : on parse... ;-)
0
Suru_Verbal Messages postés 10 Date d'inscription lundi 4 juillet 2005 Statut Membre Dernière intervention 22 juillet 2005
19 juil. 2005 à 17:36
LOL
0
davwart Messages postés 855 Date d'inscription mardi 19 novembre 2002 Statut Membre Dernière intervention 28 juillet 2009 1
19 juil. 2005 à 17:36
..je pense que malalam t'a donné le moyen de specifié une colone grace à like


-------------------------------------
Les ordinateurs, plus on s'en sert moins, moins ça a de chance de mal marcher. [Les Shadoks]
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
19 juil. 2005 à 17:42
Ah c'etait CA!! lol, oui alors : LIKE.
0
Suru_Verbal Messages postés 10 Date d'inscription lundi 4 juillet 2005 Statut Membre Dernière intervention 22 juillet 2005
20 juil. 2005 à 16:40
Voici le code (qui marche) résolvant mon problème initial grâce aux pistes que vous m'avez fournies. Cependant, j'ai deux petits soucis que j'ai réussi à éviter en bricolant (j'attends d'ailleurs de votre part toute suggestion plus propre) :

//Pour obtenir les valeurs possibles d'un champ de type ENUM ou SET
// $multiple sert à savoir si on permete les sélections multiples (1) ou non (0)
function liste_dynamique($table,$champ,$multiple){
$sql = "SHOW COLUMNS FROM $table LIKE '$champ'";
$req = mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error());
$data = mysql_fetch_assoc($req);

//traitement de la chaine
$tab = explode(",",$data['Type']);


//chaine pour l'affichage de la liste
if ($multiple == 1){
$liste = '<select name="'.$champ.'" size="4" multiple>';
}
else{
$liste = '<select name="'.$champ.'" size="1">';
}
$i=0;
while(!empty($tab[$i])){
//on elève les simple quote
//position de la première quote
$pos_deb = strpos($tab[$i],"'");
//position de la dernière quote
$pos_fin = strrpos($tab[$i],"'");


$valeur = substr($tab[$i],$pos_deb+1,$pos_fin-1);
/*
1er bricolage ("coup de cutter") : on enlève les simples quote accolés '' (dans le cas où l'on aavait rentré dans la BDD un mot avec un apostrophe, ex : 's\'exercer' --> l'antislash s'est "transformé" en une simple quote , je l'enlève donc avec cette condition (si vous voyez pourquoi, n'hésitez pas à me le dire...)
*/
$valeur = str_replace("''","'",$valeur);
/*
2ème bricolage ("coup de marteau") : pour la 1ère valeur possible du SET ou de l'ENUM, je n'arrive pas à enlever le quote final de la chaine, donc je le fais "manuellement
*/
if ($i == 0){
$valeur = substr($valeur,0,strlen($valeur)-1);
}
$liste .= '<option value="'.$valeur.'">'.$valeur.'</option>';
$i++;
}
$liste .= "</select>";
echo $liste;
}

Je pense qu'il pourrait être utile de rajouter des paramètres pour la liste déroulant notamment...
Je verrais cela plus tard...et j'attends vos suggestions !
0