2010-02-28 109 views

回答

82

我有一个codeigniter版本给你。它也从这些值中除去引号。

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; 
} 
+24

如果枚举值本身包含逗号,则此解决方案将中断。 – 2012-12-07 22:53:01

+2

此解决方案适用于codeigniter https:// github。com/thiswolf/codeigniter-enum-select-boxes – 2013-07-07 16:28:47

+3

PHP Version:$ type = $ this-> mysql-> select(“SHOW COLUMNS FROM $ table WHERE Field ='$ field'”)[0] [“Type”] ; – 2014-08-27 09:14:54

24

MySQL Reference

如果要确定所有可能的 值ENUM列,使用SHOW COLUMNS FROM tbl_name LIKE enum_col 并解析ENUM定义输出的 类型列。

你想是这样的:

$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]); 

这会给你所引用的值。 MySQL总是以单引号括起来。值中的单引号会被单引号转义。您可以安全地在每个数组元素上调用trim($val, "'")。您需要将''转换为'

下将返回$ trimmedvals数组项不带引号:

$trimmedvals = array(); 
foreach($vals as $key => $value) { 
$value=trim($value, "'"); 
$trimmedvals[] = $value; 
} 
2

我只是想添加什么jasonbar说,查询就像当:

SHOW columns FROM table 

如果你得到的结果作为阵列它将看起来像这样:

array([0],[Field],[1],[Type],[2],[Null],[3],[Key],[4],[Default],[5],[Extra]) 

其中[n]和[文本]给出相同的值。
在我找到的任何文档中都没有记录。很高兴知道还有什么。

35

您可以通过查询它像这样得到的数值:

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

从那里,你需要把它转换成一个数组:

  • EVAL直接到一个数组,如果你” (尽管MySQL的单引号转义可能不兼容),或者
  • $ options_array = str_getcsv($ options,',',“'”)可能会起作用(如果改变子字符串以跳过开始和结束括号) ,或
  • 正则表达式
2
$row = db_fetch_object($result); 
    if($row){ 
    $type = $row->Type; 
    preg_match_all("/'([^']+)'/", $type, $matches,PREG_PATTERN_ORDER); 
    return $matches[1]; 


} 
8

可以解析字符串,就好像它是一个CSV(逗号分隔值)的字符串。 PHP有一个很棒的内置函数叫做str_getcsv,它将CSV字符串转换为数组。

// 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); 

这应该给你一些类似以下内容:

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

这种方法也可以让你在你的字符串单引号(请注意使用两个单引号):

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

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

有关str_getcsv函数的更多信息,请查看PHP手册: http://uk.php.net/manual/en/function.str-getcsv.php

+1

我给的例子并没有告诉你如何从数据库中的字段信息,但也有很多这方面的例子页面上向您展示如何做到这一点。 – bashaus 2012-06-30 09:29:41

+2

'str_getcsv'只适用于PHP 5> = 5.3.0,您可以[包含此文件](http://pear.php.net/reference/PHP_Compat-latest/__filesource/fsource_PHP_Compat__PHP_Compat-1.6.0a3CompatFunctionstr_getcsv.php.html )如果你想在早期版本中获得这个功能。 – Steve 2013-01-30 16:49:05

+1

这应该是正确的方法来处理它,因为它会考虑字符串内部的转义引号和逗号。 – 2016-12-09 10:33:25

2

试试这个

describe table columnname 

为您提供所有关于该表的列的信息;

7

这是克里斯Komlenic的8 Reasons Why MySQL's ENUM Data Type Is Evil之一:

  4.获取不同的ENUM成员名单是一种痛苦。

一个非常普遍的需求是使用数据库中的可能值填充选择框或下拉列表。就像这样:

选择颜色:

[ select box ]

如果这些值存储在名为“颜色”的参考表中,所有你需要的是:SELECT * FROM colors ...然后可以分析出动态生成下拉列表。您可以添加或更改参考表中的颜色,并且您的性感订单将自动更新。真棒。

现在考虑邪恶的ENUM:你如何提取成员列表?您可以查询表中的ENUM列以获取DISTINCT值,但这只会返回实际使用的值,并且会出现在表中,而不一定是所有可能的值。您可以使用脚本语言查询INFORMATION_SCHEMA并将其从查询结果中解析出来,但这不必要的复杂。实际上,我不知道任何优雅纯粹的SQL方法来提取ENUM列的成员列表。

6

更高达做的日期的方式,这个工作对我来说:

function enum_to_array($table, $field) {  
    $query = "SHOW FIELDS FROM `{$table}` LIKE '{$field}'"; 
    $result = $db->query($sql); 
    $row = $result->fetchRow(); 
    preg_match('#^enum\((.*?)\)$#ism', $row['Type'], $matches); 
    $enum = str_getcsv($matches[1], ",", "'"); 
    return $enum; 
} 

最终,由隔开,当枚举值“枚举()”仅仅是一个CSV字符串,所以解析它!

9

这就像很多上面的内容,但给你的结果没有循环,并让你想要你真的想要:一个简单的数组产生选择选项。

BONUS:它适用于SET以及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: 阵列 ( [0] =>红色 [1] =>绿 [2] =>蓝色 )

2

这里是由帕特里克Savalle给予相同的功能适用于框架Laravel

function get_enum_values($table, $field) 
{ 

    $test=DB::select(DB::raw("show columns from {$table} where field = '{$field}'")); 

    preg_match('/^enum\((.*)\)$/', $test[0]->Type, $matches); 
    foreach(explode(',', $matches[1]) as $value) 
    { 
     $enum[] = trim($value, "'"); 
    } 

    return $enum; 

} 
2

笨适应版本的一些模型的方法:

public function enum_values($table_name, $field_name) 
{ 
    $query = $this->db->query("SHOW COLUMNS FROM `{$table_name}` LIKE '{$field_name}'"); 

    if(!$query->num_rows()) return array(); 
    preg_match_all('~\'([^\']*)\'~', $query->row('Type'), $matches); 

    return $matches[1]; 
} 

结果:

array(2) { 
    [0]=> string(13) "administrator" 
    [1]=> string(8) "customer" 
} 
+0

这不提供问题的答案。要批评或要求作者澄清,在他们的帖子下留下评论 - 你总是可以评论你自己的帖子,一旦你有足够的[声誉](http://stackoverflow.com/help/whats-reputation),你会能够[评论任何帖子](http://stackoverflow.com/help/privileges/comment)。 – worldofjr 2015-01-18 22:17:34

+0

你确定吗?为什么? 这个函数的结果可以简单地插入到像** form_dropdown **这样的函数中... – 2015-01-20 00:50:24

1

所有你使用一些陌生和复杂的正则表达式模式X)

这里是我的解决方案,而的preg_match:

function getEnumTypes($table, $field) { 
    $query = $this->db->prepare("SHOW COLUMNS FROM $table WHERE Field = ?"); 
    try {$query->execute(array($field));} catch (Exception $e) {error_log($e->getMessage());} 
    $types = $query->fetchAll(PDO::FETCH_COLUMN|PDO::FETCH_UNIQUE, 1)[$field]; 
    return explode("','", trim($types, "enum()'")); 
} 
1

这会为我工作:

SELECT REPLACE(SUBSTRING(COLUMN_TYPE,6,(LENGTH(COLUMN_TYPE)-6)),"'","") 
FROM information_schema.COLUMNS 
WHERE TABLE_SCHEMA='__TABLE_SCHEMA__' 
AND TABLE_NAME='__TABLE_NAME__' 
AND COLUMN_NAME='__COLUMN_NAME__' 

然后

explode(',', $data) 
2

可以在MySQL查询使用语法GET枚举可能值:

$syntax = "SELECT COLUMN_TYPY FROM information_schema.`COLUMNS` 
WHERE TABLE_NAME = '{$THE_TABLE_NAME}' 
AND COLUMN_NAME = '{$THE_COLUMN_OF_TABLE}'"; 

,你会得到的值,例如:枚举( '男', '女')

这是例如PHP语法时才:

<?php 
function ($table,$colm){ 

// mysql query. 
$syntax = mysql_query("SELECT COLUMN_TYPY FROM information_schema.`COLUMNS` 
WHERE TABLE_NAME = '$table' AND COLUMN_NAME ='$colm'"); 

if (!mysql_error()){ 
//Get a array possible values from table and colm. 
$array_string = mysql_fetch_array($syntax); 

    //Remove part string 
    $string = str_replace("'", "", $array_string['COLUMN_TYPE']); 
    $string = str_replace(')', "", $string); 
    $string = explode(",",substr(5,$string)); 
}else{ 
    $string = "error mysql :".mysql_error(); 
} 
// Values is (Examples) Male,Female,Other 
return $string; 
} 
?> 
3

听到的是对的mysqli

function get_enum_values($mysqli, $table, $field) 
{ 
    $type = $mysqli->query("SHOW COLUMNS FROM {$table} WHERE Field = '{$field}'")->fetch_array(MYSQLI_ASSOC)['Type']; 
    preg_match("/^enum\(\'(.*)\'\)$/", $type, $matches); 
    $enum = explode("','", $matches[1]); 
    return $enum; 
} 
$deltypevals = get_enum_values($mysqli, 'orders', 'deltype'); 
var_dump ($deltypevals); 
2

对于Laravel这工作:

$result = DB::select("SHOW COLUMNS FROM `table_name` LIKE 'status';"); 
$regex = "/'(.*?)'/"; 
preg_match_all($regex , $result[0]->Type, $enum_array); 
$enum_fields = $enum_array[1]; 
echo "<pre>"; 
print_r($enum_fields); 

输出:

Array 
(
[0] => Requested 
[1] => Call Back 
[2] => Busy 
[3] => Not Reachable 
[4] => Not Responding 
) 
0

我得到这样枚举值:

SELECT COLUMN_TYPE 
FROM information_schema.`COLUMNS` 
WHERE TABLE_NAME = 'tableName' 
    AND COLUMN_NAME = 'columnName'; 

运行该SQL我得到: enum('BDBL','AB Bank')

然后我已过滤只是用下面的代码值:

preg_match("/^enum\(\'(.*)\'\)$/", $type, $matches); 
$enum = explode("','", $matches[1]); 
var_dump($enum) ; 

停止放:

阵列(2){ [0] => 串(4) “BDBL” [1] => string(7)“AB Bank” }

0

在这个线程中的每个其他答案的问题是,他们都没有正确解析枚举中的字符串的所有特殊情况。

把我当成一个循环的最大特例是单引号,因为它们自己编码为2个单引号!因此,例如,值为'a'的枚举编码为enum('''a''')。太可怕了吧?

那么,解决方案是使用MySQL为你解析数据!

因为其他人都在这个线程中使用PHP,所以我会使用它。以下是完整的代码。我会在解释之后。参数$FullEnumString将保存整个枚举字符串,从所有其他答案中的任何方法中提取。 RunQuery()FetchRow()(非关联)代表您最喜欢的数据库访问方法。

function GetDataFromEnum($FullEnumString) 
{ 
    if(!preg_match('/^enum\((.*)\)$/iD', $FullEnumString, $Matches)) 
     return null; 
    return FetchRow(RunQuery('SELECT '.$Matches[1])); 
} 

preg_match('/^enum\((.*)\)$/iD', $FullEnumString, $Matches)确认枚举值匹配我们所期望的,这是说,"enum(".$STUFF.")"(什么也没有之前或之后)。如果preg_match失败,则返回NULL

preg_match还存储在奇怪的SQL语法中转义的字符串列表,在$Matches[1]。接下来,我们希望能够从中获得真实的数据。因此,您只需运行"SELECT ".$Matches[1],并在第一条记录中有完整的字符串列表!

所以,只需用FetchRow(RunQuery(...))即可取出该记录,就完成了。

如果你想要做这整个事情在SQL中,你可以使用下面的

SET @TableName='your_table_name', @ColName='your_col_name'; 
SET @Q=(SELECT CONCAT('SELECT ', (SELECT SUBSTR(COLUMN_TYPE, 6, LENGTH(COLUMN_TYPE)-6) FROM information_schema.COLUMNS WHERE [email protected] AND [email protected]))); 
PREPARE stmt FROM @Q; 
EXECUTE stmt; 

附:为了阻止任何人谈论它,不,我不相信这种方法会导致SQL注入。

0

获取可能值的列表已被详细记录,但expanding on another answer that returned the values in parenthesis,我想剥离它们,留下一个逗号分隔的列表,然后允许我使用爆炸类型函数,只要我需要获取数组。

SELECT 
    SUBSTRING(COLUMN_TYPE, 6, LENGTH(COLUMN_TYPE) - 6) AS val 
FROM 
    information_schema.COLUMNS 
WHERE 
    TABLE_NAME = 'articles' 
AND 
    COLUMN_NAME = 'status' 

SUBSTRING现在开始于第6个字符,并使用一个长度,该长度大于总短6个字符,删除尾部括号。

0

对于PHP 5.6+

$mysqli = new mysqli("example.com","username","password","database"); $result = $mysqli->query("SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='table_name' AND COLUMN_NAME='column_name'"); $row = $result->fetch_assoc(); var_dump($row);