Pb mysql utilisation du type SET

Résolu/Fermé
lazabelle Messages postés 11 Date d'inscription mardi 12 juin 2007 Statut Membre Dernière intervention 2 novembre 2007 - 12 oct. 2007 à 15:52
 DOX - 8 nov. 2008 à 18:34
Bonjour,

j'ai une bdd dont l'une des colonnes est de type SET.
Je souhaiterais faire une requête permettant d'extraire chacune des valeurs présentes dans "ladite" colonne.

Je m'explique :

soit ma table ma_table avec 3 colonnes : 'nom' (varchar), 'prenom'(varchar) et 'couleur'(set('gris','rouge','violet')).
Chaque entrée de ma_table peut donc avoir pour la colonne 'couleur' une, deux ou trois valeurs.

ex :
nom1, prenom1, gris
nom2, prenom2, rouge, violet
nom3, prenom3, gris,violet.

Je voudrais pouvoir intégrer dans une liste déroulante chaque valeur possible, soit :
- gris
- rouge
- violet

et non pas
- gris
- rouge, violet
- gris, violet

...et voilà, bein, je sais pas si c'est parce que j'ai la tête dans le guidon, mais je n'y arrive pas... J'ai lu quelques pistes avec show columns ou describe, mais je ne sais pas trop comment exploiter les résultats de ces requêtes.

Merci de votre aide !

6 réponses

lazabelle Messages postés 11 Date d'inscription mardi 12 juin 2007 Statut Membre Dernière intervention 2 novembre 2007 2
19 oct. 2007 à 10:20
problème résolu...
1
salut, stp comment tu as fais pour insérer dans un type (set) des valeurs a partir d'une liste multichoix?
1
Posotaz Messages postés 489 Date d'inscription samedi 23 juin 2007 Statut Membre Dernière intervention 19 juin 2011 225
13 oct. 2007 à 02:20
Salut Lazabelle,

C'est une question très intéressante qui m'a amené à lire les commentaires sur certains articles indiquant la requête "show columns", que voici : https://dev.mysql.com/doc/refman/8.0/en/set.html . Ils présentent au minimum deux méthodes pour avoir ce que tu veux.

J'en conlcus (mais il faudrait tester) qu'une requête de type
show columns from  ma_table like 'couleur'
(si j'ai bien compris la syntaxe) renvoie une ligne représentant les informations désirées avec la deuxième colonne contenant la liste des valeurs de la colonne set séparées par des virgules (+ le mot clé "set"). Certains utiliseraient le nom de colonne "Type" plutôt que de récupérer le deuxième indice numériquement... enfin il faudrait vraiment tester, si tu pouvais nous tenir au courant ce serait chouette. Bref, à la fin il suffit d'utiliser la méthode split (appuyée d'un nettoyage préalable) pour récupérer les différentes valeurs dans un tableau (et donc les placer dans une combobox ou ce que tu veux).

Ici le résumé des deux méthodes, avec en gras ce qui me semble essentiel :
Here's some PHP code to return the possible
options of a set as an array.

<?
/**
 * @return array
 * @param table DB table
 * @param column Column name
 * @desc Return an array of the possible values for a SET
 */
function get_set($table,$column)
{
    $sql = "SHOW COLUMNS FROM $table LIKE '$column'";
    if (!($ret = mysql_query($sql)))
        die("Error: Could not show columns");

    $line = mysql_fetch_assoc($ret);
    $set  = $line['Type'];
    $set  = substr($set,5,strlen($set)-7); // Remove "set(" at start and ");" at end
    return preg_split("/','/",$set); // Split into and array
}
?> 

If you want to get an array in php with all possible values for an ENUM or SET column, you should use: SHOW COLUMNS FROM table_name LIKE 'enum_column_name' (with or without %-wildcards), and parse it with the following php script:

$result=mysql_query($query);
if(mysql_num_rows($result)>0){
$row=mysql_fetch_row($result);
$options=explode("','",preg_replace("/(enum|set)\('(.+?)'\)/","\\2",$row[1]));
}

Now $options is an array with all possible values

à tester, bon courage ! :-)
0
lazabelle Messages postés 11 Date d'inscription mardi 12 juin 2007 Statut Membre Dernière intervention 2 novembre 2007 2
13 oct. 2007 à 11:42
Merci Posotaz...

...pour ta réponse et pour les liens et scripts.
J'ai essayé la première méthode avec preg_split, et ça fonctionne parfaitement.

SAUF QUE c'était idiot de ma part de parler de SHOW COLUMNS car en fait j'ai besoin d'extraire chacune des valeurs qui sont utilisées dans ma table et pas l'ensemble des valeurs possibles.

je retourne à mon exemple du 1er post en ayant modifié les données en gras:
nom1, prenom1, gris
nom2, prenom2, rouge, gris
nom3, prenom3, gris,rouge.

je voudrais intégrer dans ma liste déroulante ces valeurs là :
- gris
- rouge


et non pas comme avec la méthode show columns + split :
- gris
- rouge
- violet
(puisque violet n'est pas encore une valeur utilisée dans ma table).

Bon j'espère que je suis à peu près claire... merci en tout cas de m'avoir mis sur la piste de preg_split, car je pense que c'est en parsant les valeurs de ma table que je vais y parvenir. (dommage en tout cas que ce ne soit pas possible avec une requête mysql !)

@+
0

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

Posez votre question
lazabelle Messages postés 11 Date d'inscription mardi 12 juin 2007 Statut Membre Dernière intervention 2 novembre 2007 2
15 oct. 2007 à 15:16
Bon bein finalement je n'ai pas trouvé la solution que je cherchais, par contre voilà ce que je fais pour avoir les valeurs que je veux dans ma liste déroulante. En gros je récupère mes valeurs préalablement parsées dans une table temporaire que j'utilise pour remplir ma liste.


//je crée une table temporaire qui récupèrera tout à l'heure les données parsées mais qui recevra des doublons
$query=mysql_query("CREATE TABLE `couleur_temp` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`couleur` VARCHAR( 50 ) NOT NULL
)") or die (mysql_error());


// je sélectionne les couleurs présentes dans ma table ma_table :
$contenu_couleurs=mysql_query("SELECT DISTINCT couleur FROM ma_table") or die (mysql_error());

// je compte le nbre de résultats (de lignes retournées)
$count=mysql_num_rows($contenu_couleurs);


// je récupère les résulats dans un tableau
while ($donnees_couleurs=mysql_fetch_array($contenu_couleurs)) {


$parse[0]=preg_split("/,/",$donnees_couleurs['couleur']); //ici je parse mon résultat au cas où il y ait plusieurs valeurs
$nbre_res=count($parse[0]); //je compte le nbre de valeurs parsées

//boucle pour remplir la table temporaire couleur_temp.
for($e=0; $e<$nbre_res; $e++) {

$donnee=$parse[0][$e];

$query=mysql_query("INSERT INTO couleur_temp VALUES ('','$donnee')") or die (mysql_error());
}

}

//et c'est donc à partir de cette table que je remplis ma liste déroulante
$contenu_couleur_temp=mysql_query("SELECT DISTINCT couleur FROM couleur_temp ORDER BY couleur") or die (mysql_error());
while ($donnees_couleur_temp=mysql_fetch_array($contenu_couleur_temp)) {

echo'<option value="'.$donnees_couleur_temp['couleur'].'">'.$donnees_couleur_temp['couleur'].'</option>';
}

//et je supprime ma table que je voulais temporaire (et comme je ne sais toujours pas utiliser [TEMPORARY]...)

$suppr=mysql_query("DROP TABLE couleur_temp") or die (mysql_error());



voilou... mais je pense qu'il doit y avoir plus simple, n'étant une pro ni de php ni de mysql, je ne connais pas toutes les fonctions ou manips possibles. donc si certains passant par là peuvent m'éclairer sur ce point...
Merci d'avance !
0
Posotaz Messages postés 489 Date d'inscription samedi 23 juin 2007 Statut Membre Dernière intervention 19 juin 2011 225
16 oct. 2007 à 22:50
Salut,

Je maintiens ma position de méconnaissance face aux champs de type SET donc je persiste à dire que l'utilisation d'un langage procédural est indispensable à la réalisation de ce projet, comme tu le fais :-)

Par contre je doute qu'il soit nécessaire de créer une table contenant les valeurs désirées et de l'effacer ensuite. Pourquoi ne pas tout simplement placer les résultats dans un tableau plutôt que de les insérer dans une nouvelle table temporaire ? Il suffira de mettre ce code de "parsage" dans un fichier de fonctions et de l'appeler dès que besoin... tu ne feras ainsi que lire des données et éviter des écritures disque inutiles.

Et ainsi, avant d'insérer la valeur dans le tableau ce serait bien de tester si elle existe déjà à l'aide de la fonction in_array() de PHP. Ainsi il sera certain que le tableau contiendra des valeurs uniques, sans devoir procéder à une simulation du "select distinct".

Rien de mieux à te proposer désolé ;)
0
lazabelle Messages postés 11 Date d'inscription mardi 12 juin 2007 Statut Membre Dernière intervention 2 novembre 2007 2
19 oct. 2007 à 10:19
Merci, pour tes conseils que je vais suivre !
0