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
DOX - 8 nov. 2008 à 18:34
A voir également:
- Mysql type set
- Set-top box - Accueil - Box & Connexion Internet
- Mysql community server - Télécharger - Bases de données
- Clear type - Guide
- Changer le type de fichier - Guide
- Type de ram - Guide
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
19 oct. 2007 à 10:20
problème résolu...
salut, stp comment tu as fais pour insérer dans un type (set) des valeurs a partir d'une liste multichoix?
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
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
Ici le résumé des deux méthodes, avec en gras ce qui me semble essentiel :
à tester, bon courage ! :-)
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 ! :-)
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
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 !)
@+
...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 !)
@+
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
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 !
//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 !
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
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é ;)
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é ;)
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
19 oct. 2007 à 10:19
Merci, pour tes conseils que je vais suivre !