Je souhaite remplir automatiquement mes listes déroulantes avec une énumération des valeurs possibles d'une base de données. Est-ce possible dans MySQL?
96
J'ai une version de codeigniter pour vous. Il supprime également les guillemets des valeurs.
function get_enum_values( $table, $field )
{
$type = $this->db->query( "SHOW COLUMNS FROM {$table} WHERE Field = '{$field}'" )->row( 0 )->Type;
preg_match("/^enum\(\'(.*)\'\)$/", $type, $matches);
$enum = explode("','", $matches[1]);
return $enum;
}
Vous pouvez obtenir les valeurs en l'interrogeant comme ceci:
À partir de là, vous devrez le convertir en un tableau:
la source
Référence MySQL
Vous voudriez quelque chose comme:
Cela vous donnera les valeurs citées. MySQL les renvoie toujours entre guillemets simples. Un guillemet simple dans la valeur est échappé par un guillemet simple. Vous pouvez probablement appeler en toute sécurité
trim($val, "'")
chacun des éléments du tableau. Vous voudrez convertir''
en juste'
.Ce qui suit renverra les éléments du tableau $ trimmedvals sans guillemets:
la source
C'est comme beaucoup de ce qui précède, mais vous donne le résultat sans boucles, ET vous donne ce que vous voulez vraiment: un simple tableau pour générer des options de sélection.
BONUS: Cela fonctionne pour les types de champs SET ainsi que ENUM.
$ option_array: Array ([0] => rouge [1] => vert [2] => bleu)
la source
C'est l'une des 8 raisons de Chris Komlenic pour lesquelles le type de données ENUM de MySQL est mauvais :
la source
Vous pouvez analyser la chaîne comme s'il s'agissait d'une chaîne CSV (Comma Separated Value). PHP a une excellente fonction intégrée appelée str_getcsv qui convertit une chaîne CSV en un tableau.
Cela devrait vous donner quelque chose de similaire à ce qui suit:
Cette méthode vous permet également d'avoir des guillemets simples dans vos chaînes (notez l'utilisation de deux guillemets simples):
Pour plus d'informations sur la fonction str_getcsv, consultez le manuel PHP: http://uk.php.net/manual/en/function.str-getcsv.php
la source
str_getcsv
ne fonctionne qu'en PHP 5> = 5.3.0, vous pouvez inclure ce fichier si vous souhaitez obtenir cette fonctionnalité dans les versions antérieures.Une façon plus à jour de le faire, cela a fonctionné pour moi:
En fin de compte, les valeurs d'énumération lorsqu'elles sont séparées de "enum ()" ne sont qu'une chaîne CSV, alors analysez-les comme telles!
la source
voici pour mysqli
la source
Voici la même fonction donnée par Patrick Savalle adaptée pour le framework Laravel
la source
Je veux simplement ajouter à ce que dit jasonbar , lors d'une requête comme:
Si vous obtenez le résultat sous forme de tableau, il ressemblera à ceci:
Où [n] et [texte] donnent la même valeur.
Pas vraiment dit dans aucune documentation que j'ai trouvée. Tout simplement bon de savoir ce qu'il y a d'autre.
la source
la source
essaye ça
vous donne toutes les informations sur cette colonne dans ce tableau;
la source
Codeigniter adaptant la version comme méthode de certains modèles:
Résultat:
la source
Vous utilisez tous des modèles de regex étranges et complexes x)
Voici ma solution sans preg_match:
la source
Vous pouvez utiliser cette syntaxe pour obtenir une énumération des valeurs possibles dans MySQL QUERY:
et vous obtenez une valeur, exemple: enum ('Male', 'Female')
voici un exemple de sytaxe php:
la source
Pour Laravel, cela a fonctionné:
Production:
la source
Le problème avec toutes les autres réponses dans ce thread est qu'aucune d'entre elles n'analyse correctement tous les cas spéciaux des chaînes dans l'énumération.
Le plus grand caractère de cas spécial qui me jetait pour une boucle était les guillemets simples, car ils sont eux-mêmes encodés sous forme de 2 guillemets simples ensemble! Ainsi, par exemple, une énumération avec la valeur
'a'
est codée commeenum('''a''')
. Horrible, non?Eh bien, la solution est d'utiliser MySQL pour analyser les données à votre place!
Puisque tout le monde utilise PHP dans ce fil, c'est ce que je vais utiliser. Voici le code complet. Je vais l'expliquer après. Le paramètre
$FullEnumString
contiendra toute la chaîne d'énumération, extraite de la méthode que vous souhaitez utiliser de toutes les autres réponses.RunQuery()
etFetchRow()
(non associatif) sont des substituts pour vos méthodes d'accès DB préférées.preg_match('/^enum\((.*)\)$/iD', $FullEnumString, $Matches)
confirme que la valeur enum correspond à ce que nous attendons, c'est-à-dire"enum(".$STUFF.")"
(sans rien avant ou après). Si le preg_match échoue,NULL
est renvoyé.Cela
preg_match
stocke également la liste des chaînes, échappées dans une syntaxe SQL étrange, dans$Matches[1]
. Ensuite, nous voulons pouvoir en tirer les vraies données. Alors vous venez de courir"SELECT ".$Matches[1]
, et vous avez une liste complète des chaînes de votre premier enregistrement!Alors sortez simplement cet enregistrement avec un
FetchRow(RunQuery(...))
et vous avez terminé.Si vous vouliez faire tout cela en SQL, vous pouvez utiliser ce qui suit
PS Pour empêcher quiconque de dire quelque chose à ce sujet, non, je ne crois pas que cette méthode puisse conduire à une injection SQL.
la source
Pour récupérer la liste des valeurs possibles a été bien documentée, mais en développant une autre réponse qui renvoyait les valeurs entre parenthèses , je voulais les supprimer en me laissant avec une liste séparée par des virgules qui me permettrait ensuite d'utiliser une fonction de type éclaté chaque fois que je nécessaire pour obtenir un tableau.
Le
SUBSTRING
commence maintenant au 6ème caractère et utilise une longueur qui est de 6 caractères plus courte que le total, en supprimant la parenthèse de fin.la source
cela fonctionnera pour moi:
puis
la source
Pour PHP 5.6+
la source
Il est extraordinaire qu'aucun de vous n'ait pensé que si vous utilisez un champ enum, cela signifie que les valeurs à attribuer sont connues "a priori".
Par conséquent, si les valeurs sont connues "a priori", la meilleure façon de les gérer est d'utiliser une classe Enum très simple.
Baiser la règle et enregistrer un appel de base de données.
http://it2.php.net/manual/en/class.splenum.php
la source
J'obtiens les valeurs d'énumération de cette manière:
En exécutant ce sql, j'ai get: enum ('BDBL', 'AB Bank')
alors j'ai filtré juste la valeur en utilisant le code suivant:
Production :
array (2) {[0] => string (4) "BDBL" [1] => string (7) "AB Bank"}
la source
Exemple:
la source
SELECT SUBSTRING (COLUMN_TYPE, 6, LENGTH (COLUMN_TYPE) - 6) AS val FROM information_schema.COLUMNS WHERE TABLE_NAME = 'articles' AND COLUMN_NAME = 'status'
Ne fonctionnerait pas pour enum ('', 'X''XX')
la source