Desejo preencher meus menus suspensos com valores possíveis de enum de um banco de dados automaticamente. Isso é possível no MySQL?
96
Eu tenho uma versão codeigniter para você. Ele também remove as aspas dos 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;
}
Você pode obter os valores consultando-os assim:
A partir daí, você precisará convertê-lo em uma matriz:
fonte
Referência MySQL
Você gostaria de algo como:
Isso lhe dará os valores cotados. O MySQL sempre os retorna entre aspas simples. Uma aspa simples no valor é escapada por uma aspa simples. Você provavelmente pode chamar com segurança
trim($val, "'")
cada um dos elementos da matriz. Você vai querer se converter''
em justo'
.O seguinte retornará itens da matriz $ trimmedvals sem aspas:
fonte
Isso é parecido com muitos dos itens acima, mas fornece o resultado sem loops, E dá o que você realmente deseja: um array simples para gerar opções de seleção.
BÔNUS: funciona para os tipos de campo SET e ENUM.
$ option_array: Array ([0] => vermelho [1] => verde [2] => azul)
fonte
Esta é uma das 8 razões de Chris Komlenic pelas quais o tipo de dados ENUM do MySQL é mau :
fonte
Você pode analisar a string como se fosse uma string CSV (Comma Separated Value). O PHP tem uma ótima função integrada chamada str_getcsv que converte uma string CSV em um array.
Isso deve dar a você algo semelhante ao seguinte:
Este método também permite que você coloque aspas simples em suas strings (observe o uso de duas aspas simples):
Para obter mais informações sobre a função str_getcsv, verifique o manual do PHP: http://uk.php.net/manual/en/function.str-getcsv.php
fonte
str_getcsv
só funciona no PHP 5> = 5.3.0, você pode incluir este arquivo se quiser obter esta funcionalidade em versões anteriores.Uma maneira mais atualizada de fazer isso funcionou para mim:
Em última análise, os valores enum quando separados de "enum ()" são apenas uma string CSV, então analise-a como tal!
fonte
aqui é para mysqli
fonte
Aqui está a mesma função dada por Patrick Savalle adaptada para o framework Laravel
fonte
Eu simplesmente quero acrescentar o que jasonbar diz, ao fazer consultas como:
Se você obtiver o resultado como uma matriz, será semelhante a este:
Onde [n] e [texto] fornecem o mesmo valor.
Realmente não disse em qualquer documentação que encontrei. É simplesmente bom saber o que mais existe.
fonte
fonte
tente isso
dá a você todas as informações sobre aquela coluna na tabela;
fonte
Codeigniter adaptando a versão como método de algum modelo:
Resultado:
fonte
Todos vocês usam alguns padrões regex estranhos e complexos x)
Aqui está minha solução sem preg_match:
fonte
Você pode usar esta sintaxe para obter os valores possíveis de enum no MySQL QUERY:
e você obtém um valor, por exemplo: enum ('Masculino', 'Feminino')
este é um exemplo de Sytax php:
fonte
Para o Laravel isso funcionou:
Resultado:
fonte
O problema com todas as outras respostas neste encadeamento é que nenhuma delas analisa adequadamente todos os casos especiais das strings dentro do enum.
O maior caractere de caso especial que estava me deixando confuso eram aspas simples, já que eles são codificados como 2 aspas simples juntas! Portanto, por exemplo, um enum com o valor
'a'
é codificado comoenum('''a''')
. Horrível, certo?Bem, a solução é usar o MySQL para analisar os dados para você!
Já que todo mundo está usando PHP neste tópico, é isso que usarei. A seguir está o código completo. Vou explicar depois. O parâmetro
$FullEnumString
conterá toda a string enum, extraída de qualquer método que você deseja usar de todas as outras respostas.RunQuery()
eFetchRow()
(não associativo) são substitutos para seus métodos de acesso de banco de dados favoritos.preg_match('/^enum\((.*)\)$/iD', $FullEnumString, $Matches)
confirma que o valor enum corresponde ao que esperamos, ou seja,"enum(".$STUFF.")"
(sem nada antes ou depois). Se o preg_match falhar,NULL
é retornado.Isso
preg_match
também armazena a lista de strings, escapadas na estranha sintaxe SQL, em$Matches[1]
. Em seguida, queremos ser capazes de obter os dados reais disso. Então, você apenas executa"SELECT ".$Matches[1]
e tem uma lista completa das cordas em seu primeiro registro!Então, basta puxar aquele registro com um
FetchRow(RunQuery(...))
e pronto.Se você quiser fazer tudo isso em SQL, poderá usar o seguinte
PS Para evitar que alguém diga algo sobre isso, não, não acredito que esse método possa levar à injeção de SQL.
fonte
Buscar a lista de valores possíveis foi bem documentado, mas expandindo em outra resposta que retornou os valores entre parênteses , eu queria retirá-los, deixando-me com uma lista separada por vírgulas que me permitiria usar uma função do tipo explodir sempre que eu necessário para obter uma matriz.
O
SUBSTRING
now começa no 6º caractere e usa um comprimento que é 6 caracteres mais curto que o total, removendo o parêntese final.fonte
isso vai funcionar para mim:
e depois
fonte
Para PHP 5.6+
fonte
É extraordinário como nenhum de vocês pensou que se você estiver usando um campo enum, isso significa que os valores a serem atribuídos são conhecidos "a priori".
Portanto, se os valores são conhecidos "a priori", a melhor maneira de gerenciá-los é por meio de uma classe Enum muito simples.
Beije a regra e salve uma chamada de banco de dados.
http://it2.php.net/manual/en/class.splenum.php
fonte
Eu obtenho valores enum desta forma:
Executando este sql, obtive: enum ('BDBL', 'Banco AB')
então, filtrou apenas o valor usando o seguinte código:
Resultado :
matriz (2) {[0] => string (4) "BDBL" [1] => string (7) "Banco AB"}
fonte
Exemplo:
fonte
SELECIONE SUBSTRING (COLUMN_TYPE, 6, LENGTH (COLUMN_TYPE) - 6) AS val FROM information_schema.COLUMNS WHERE TABLE_NAME = 'artigos' AND COLUMN_NAME = 'status'
Não funcionaria para enum ('', 'X''XX')
fonte