113 votes

Comment obtenir des valeurs possibles enum dans une base de données MySQL?

Je souhaite renseigner automatiquement mes listes déroulantes avec les valeurs possibles d'une base de données enum. Est-ce possible dans MySQL?

113voto

Patrick Savalle Points 1148

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);
    foreach( explode(',', $matches[1]) as $value )
    {
         $enum[] = trim( $value, "'" );
    }
    return $enum;
}
 

60voto

Matthew Points 25748

Vous pouvez obtenir les valeurs comme ceci:

 SELECT SUBSTRING(COLUMN_TYPE,5)
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA='databasename' 
    AND TABLE_NAME='tablename'
    AND COLUMN_NAME='columnname'"
 

A partir de là, vous devrez le convertir en tableau:

  • évaluez cela directement dans un tableau si vous êtes paresseux (bien que l'échappement de guillemets simples de MySQL puisse être incompatible), ou
  • $ options_array = str_getcsv ($ options, ',', "'") pourrait éventuellement fonctionner (si vous modifiez la sous-chaîne pour ignorer les parenthèses ouvrantes et fermantes), ou
  • une expression régulière

37voto

jasonbar Points 7212

De Référence De MySQL

Si vous souhaitez déterminer tous les possibles valeurs pour un ENUM colonne, utilisez AFFICHER Les COLONNES DE nom_table COMME enum_col et d'analyser les ENUM définition dans le Colonne Type de la sortie.

Vous voulez quelque chose comme:

$sql = "SHOW COLUMNS FROM `table` LIKE 'column'";
$result = $db->query($sql);
$row = $result->fetchRow();
$type = $row['Type'];
preg_match('/enum\((.*)\)$/', $type, $matches);
$vals = explode(',', $matches[1]);

Cela vous donnera la cité des valeurs. MySQL retourne toujours ces entourés de guillemets simples. Une seule citation de la valeur est échappé par une apostrophe. Vous pouvez probablement vous en toute sécurité appeler trim($val, "'") sur chacun des éléments du tableau. Vous aurez envie de covnert '' en '.

14voto

Phreditor Points 11

Cela ressemble à beaucoup de ce qui précède, mais vous donne le résultat sans boucles, ET vous donne ce que vous voulez vraiment: un tableau simple pour générer des options de sélection.

BONUS: Cela fonctionne pour les types de champs SET et ENUM.

 $result = $db->query("SHOW COLUMNS FROM table LIKE 'column'");
if ($result) {
    $option_array = explode("','",preg_replace("/(enum|set)\('(.+?)'\)/","\\2", $result[0]->Type));
}
 

$ option_array: Array ([0] => rouge [1] => vert [2] => bleu)

10voto

bashaus Points 157

Vous pouvez analyser la chaîne, comme si c'était un fichier CSV (valeurs Séparées par des Virgules) de la chaîne. PHP a une grande accumulation en fonction appelée str_getcsv qui convertit un fichier CSV chaîne dans un tableau.

// This is an example to test with
$enum_or_set = "'blond','brunette','redhead'";

// Here is the parser
$options = str_getcsv($enum_or_set, ',', "'");

// Output the value
print_r($options);

Cela devrait vous donner quelque chose de similaire à la suivante:

Array
(
    [0] => blond
    [1] => brunette
    [2] => redhead
)

Cette méthode vous permet également d'avoir des guillemets simples dans vos cordes (notez l'utilisation de deux guillemets simples):

$enum_or_set = "'blond','brunette','red''head'";

Array
(
    [0] => blond
    [1] => brunette
    [2] => red'head
)

Pour plus d'informations sur le str_getcsv fonction, consultez le manuel PHP: http://uk.php.net/manual/en/function.str-getcsv.php

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X