Lister les valeurs d'un champ de type SET ou ENUM
Posté : 09 janv. 2007, 20:35
Je me suis trouvé face à un problème et l'utilisation d'une procédure stockée m'opposant une farouche résistance, j'ai contourné le problème autrement.
But de la manoeuvre :
Obtenir la liste des valeurs possibles dans un champ de type SET ou ENUM pour construire à la volée une liste déroulante dans un formulaire. Voici comment j'ai procédé.
D'abord utiliser une requête SHOW pour récupérer les informations sur la colonne visée :
Celle-ci s'exécute sans la moindre anicroche et retourne un tableau comme celui-ci :
Ensuite, je récupère le résultat et deux colonnes m'intéressent : Type et Default
Je parse ça avec une toute petite expression régulière.
Comme j'utilise une classe perso, vous n'aurez pas le code de connexion ni l'exécution, mais on s'en cogne, ce qui nous intéresse est la suite. Voici la méthode complète avec les commentaires :
Enjoy
But de la manoeuvre :
Obtenir la liste des valeurs possibles dans un champ de type SET ou ENUM pour construire à la volée une liste déroulante dans un formulaire. Voici comment j'ai procédé.
D'abord utiliser une requête SHOW pour récupérer les informations sur la colonne visée :
Code : Tout sélectionner
SHOW COLUMNS FROM telephone WHERE Field = 'tel_type';Code : Tout sélectionner
mysql> SHOW COLUMNS FROM telephone WHERE Field = 'tel_type';
+----------+--------------------------------------------+------+-----+----------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------------------------------------+------+-----+----------+-------+
| tel_type | enum('domicile','portable','fax','bureau') | NO | | domicile | |
+----------+--------------------------------------------+------+-----+----------+-------+
1 row in set (0.02 sec)Je parse ça avec une toute petite expression régulière.
Comme j'utilise une classe perso, vous n'aurez pas le code de connexion ni l'exécution, mais on s'en cogne, ce qui nous intéresse est la suite. Voici la méthode complète avec les commentaires :
<?php
//...
/**
* Liste des valeurs possibles.
*
* La méthode va récupérer les valeurs possible d'une colonne de
* type ENUM ou SET.
* Les valeur seront isolées et stockées dans un tableau. Ce tableau
* a deux dimensions, la première contient un tableau de valeurs, la
* seconde une chaine avec la valeur par défaut.
* Par exemple :
* <code>$option_telephone = $cnx_rechdetail->listeEnum("telephone", "tel_type");</code>
* Va retourner un tableau comme celui-ci :
* <code>array(2) {
* ["valeurs"]=>
* array(4) {
* [0]=>
* string(8) "domicile"
* [1]=>
* string(8) "portable"
* [2]=>
* string(3) "fax"
* [3]=>
* string(6) "bureau"
* }
* ["defaut"]=>
* string(8) "domicile"
* }</code>
*
* @param String $table Table où se trouve la colonne à consulter
* @param String $colonne Colonne dont on veut les valeurs
* @return Array
*/
public function listeEnum($table, $colonne)
{
/* Construction de la requête */
$this->setNouvelleRequete("SHOW COLUMNS FROM ". $table ." WHERE Field = '". $colonne ."';");
$chaine = "";
$defaut = "";
while(false != ($ligne = $this->tableau_associatif()))
{
$chaine = $ligne['Type'];
$defaut = $ligne['Default'];
}
/* Traitement de la chaine récupérée */
$masque = "#(?:enum|set)\('([^\)].*)'\)$#i";
$valeurs = preg_replace($masque, "$1", $chaine);
$tval = explode("','", $valeurs);
$retour = array("valeurs" => $tval, "defaut" => $defaut);
return $retour;
}
//...
?>
Voilà, avec ça, on récupéere un tableau qu'il suffit de passer dans une boucle pour construire rapidement des listes déroulantes avec éventuellement une option sélectionnée par défaut.Enjoy