Quiero completar mis menús desplegables con enumeración de posibles valores de una base de datos automáticamente. ¿Es esto posible en MySQL?
96
Tengo una versión de codeigniter para ti. También elimina las comillas de los valores.
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;
}
Puede obtener los valores consultando de esta manera:
A partir de ahí, deberá convertirlo en una matriz:
fuente
Referencia de MySQL
Querrías algo como:
Esto le dará los valores cotizados. MySQL siempre los devuelve entre comillas simples. Una comilla simple en el valor se escapa por una comilla simple. Probablemente pueda llamar con seguridad
trim($val, "'")
a cada uno de los elementos de la matriz. Querrás convertir''
en solo'
.Lo siguiente devolverá elementos de la matriz $ trimmedvals sin comillas:
fuente
Esto es como muchos de los anteriores, pero le brinda el resultado sin bucles, Y obtiene lo que realmente desea: una matriz simple para generar opciones de selección.
BONUS: funciona para los tipos de campo SET y ENUM.
$ option_array: Array ([0] => rojo [1] => verde [2] => azul)
fuente
Esta es una de las 8 razones de Chris Komlenic por las que el tipo de datos ENUM de MySQL es malo :
fuente
Puede analizar la cadena como si fuera una cadena CSV (valores separados por comas). PHP tiene una gran función incorporada llamada str_getcsv que convierte una cadena CSV en una matriz.
Esto debería darle algo similar a lo siguiente:
Este método también le permite tener comillas simples en sus cadenas (observe el uso de dos comillas simples):
Para obtener más información sobre la función str_getcsv, consulte el manual de PHP: http://uk.php.net/manual/en/function.str-getcsv.php
fuente
str_getcsv
solo funciona en PHP 5> = 5.3.0, puede incluir este archivo si desea obtener esta funcionalidad en versiones anteriores.Una forma más actualizada de hacerlo, esto funcionó para mí:
En última instancia, los valores de enumeración cuando se separan de "enum ()" son solo una cadena CSV, ¡así que analícela como tal!
fuente
aquí es para mysqli
fuente
Aquí está la misma función dada por Patrick Savalle adaptada para el framework Laravel
fuente
Simplemente quiero agregar a lo que dice jasonbar , al consultar como:
Si obtiene el resultado como una matriz, se verá así:
Donde [n] y [texto] dan el mismo valor.
Realmente no se dice en ninguna documentación que haya encontrado. Simplemente es bueno saber qué más hay.
fuente
fuente
prueba esto
le brinda toda la información sobre esa columna en esa tabla;
fuente
Codeigniter adaptando la versión como método de algún modelo:
Resultado:
fuente
Todos ustedes usan algunos patrones de expresiones regulares extraños y complejos x)
Aquí está mi solución sin preg_match:
fuente
Puede usar esta sintaxis para obtener valores posibles de enumeración en MySQL QUERY:
y obtienes valor, ejemplo: enum ('Hombre', 'Mujer')
este es un ejemplo de sytax php:
fuente
Para Laravel esto funcionó:
Salida:
fuente
El problema con todas las demás respuestas en este hilo es que ninguno de ellos analiza correctamente todos los casos especiales de las cadenas dentro de la enumeración.
El personaje de caso especial más grande que me estaba lanzando por un bucle eran las comillas simples, ¡ya que están codificadas como 2 comillas simples juntas! Entonces, por ejemplo, una enumeración con el valor
'a'
se codifica comoenum('''a''')
. Horrible, ¿verdad?Bueno, ¡la solución es usar MySQL para analizar los datos por usted!
Dado que todos los demás usan PHP en este hilo, eso es lo que usaré. A continuación se muestra el código completo. Lo explicaré después. El parámetro
$FullEnumString
contendrá toda la cadena de enumeración, extraída de cualquier método que desee utilizar de todas las demás respuestas.RunQuery()
yFetchRow()
(no asociativo) son sustitutos de sus métodos de acceso a bases de datos favoritos.preg_match('/^enum\((.*)\)$/iD', $FullEnumString, $Matches)
confirma que el valor de enumeración coincide con lo que esperamos, es decir,"enum(".$STUFF.")"
(sin nada antes o después). Si preg_match falla,NULL
se devuelve.Esto
preg_match
también almacena la lista de cadenas, escapadas en una sintaxis SQL extraña, en formato$Matches[1]
. Entonces, a continuación, queremos poder obtener los datos reales de eso. ¡Así que simplemente corres"SELECT ".$Matches[1]
y tienes una lista completa de las cadenas en tu primer disco!Así que saca ese disco con a
FetchRow(RunQuery(...))
y listo.Si quisiera hacer todo esto en SQL, podría usar lo siguiente
PD: Para evitar que alguien diga algo al respecto, no, no creo que este método pueda conducir a una inyección SQL.
fuente
Para obtener la lista de valores posibles se ha documentado bien, pero expandiendo otra respuesta que devolvía los valores entre paréntesis , quería eliminarlos dejándome con una lista separada por comas que luego me permitiría usar una función de tipo de explosión cada vez que necesario para obtener una matriz.
El
SUBSTRING
ahora comienza en el sexto carácter y usa una longitud que es 6 caracteres más corta que el total, eliminando el paréntesis final.fuente
esto funcionará para mí:
y entonces
fuente
Para PHP 5.6+
fuente
Es extraordinario cómo ninguno de ustedes ha pensado que si está utilizando un campo de enumeración significa que los valores a asignar se conocen "a priori".
Por tanto si los valores se conocen "a priori" la mejor forma de gestionarlos es a través de una clase Enum muy sencilla.
Besa la regla y guarda una llamada a la base de datos.
http://it2.php.net/manual/en/class.splenum.php
fuente
Obtengo valores de enumeración de esta manera:
Ejecutando este sql tengo get: enum ('BDBL', 'AB Bank')
luego he filtrado solo el valor usando el siguiente código:
Fuera puesto:
matriz (2) {[0] => cadena (4) "BDBL" [1] => cadena (7) "Banco AB"}
fuente
Ejemplo:
fuente
SELECCIONE SUBSTRING (COLUMN_TYPE, 6, LENGTH (COLUMN_TYPE) - 6) AS val FROM information_schema.COLUMNS WHERE TABLE_NAME = 'articles' AND COLUMN_NAME = 'status'
No funcionaría para enum ('', 'X''XX')
fuente