PHP/MySQL : liste déroulante dynamique

Signaler
Messages postés
10
Date d'inscription
lundi 4 juillet 2005
Statut
Membre
Dernière intervention
22 juillet 2005
-
Messages postés
10
Date d'inscription
lundi 4 juillet 2005
Statut
Membre
Dernière intervention
22 juillet 2005
-
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
A voir également:

10 réponses

Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
25
hello,



utilise
SHOW COLUMNS sur ta colonne ENUM, et parse le resultat.
Messages postés
10
Date d'inscription
lundi 4 juillet 2005
Statut
Membre
Dernière intervention
22 juillet 2005

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...
Messages postés
855
Date d'inscription
mardi 19 novembre 2002
Statut
Membre
Dernière intervention
28 juillet 2009
1
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]
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
25
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
Messages postés
10
Date d'inscription
lundi 4 juillet 2005
Statut
Membre
Dernière intervention
22 juillet 2005

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 ?
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
25
Si : on parse... ;-)
Messages postés
10
Date d'inscription
lundi 4 juillet 2005
Statut
Membre
Dernière intervention
22 juillet 2005

LOL
Messages postés
855
Date d'inscription
mardi 19 novembre 2002
Statut
Membre
Dernière intervention
28 juillet 2009
1
..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]
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
25
Ah c'etait CA!! lol, oui alors : LIKE.
Messages postés
10
Date d'inscription
lundi 4 juillet 2005
Statut
Membre
Dernière intervention
22 juillet 2005

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 !