我想要从数据库自动获取枚举值,然后将其填充到下拉框中。在MySQL中是否可以实现这个功能?
function get_enum_values( $table, $field )
{
$type = fetchRowFromDB( "SHOW COLUMNS FROM {$table} WHERE Field = '{$field}'" )->Type;
preg_match("/^enum\(\'(.*)\'\)$/", $type, $matches);
$enum = explode("','", $matches[1]);
return $enum;
}
你可以像这样查询并获取值:
SELECT SUBSTRING(COLUMN_TYPE,5)
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA='databasename'
AND TABLE_NAME='tablename'
AND COLUMN_NAME='columnname'
从那里开始,你需要将它转换为数组:
如果您想确定ENUM列的所有可能值,请使用SHOW COLUMNS FROM tbl_name LIKE enum_col,并解析输出中Type列中的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;
}
这与上面的很多类似,但可以在无需循环的情况下给出结果,并且为生成选择选项提供了一个简单的数组。
奖励:它适用于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] => 蓝色 )
您可以将字符串解析为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
SELECT * FROM colors
...就可以解析出动态生成的下拉列表。你可以在引用表中添加或更改颜色,你性感的订单表格就会自动更新。太棒了。更现代的方法是这样做,这对我有效:
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;
}
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);
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', @DBName='your_database_name';
SET @Q=(SELECT CONCAT('SELECT ', (SELECT SUBSTR(COLUMN_TYPE, 6, LENGTH(COLUMN_TYPE)-6) FROM information_schema.COLUMNS WHERE TABLE_NAME=@TableName AND COLUMN_NAME=@ColName AND TABLE_SCHEMA=@DBName)));
PREPARE stmt FROM @Q;
EXECUTE stmt;
补充一句,为了防止有人提出质疑,我并不认为这种方法会导致SQL注入。
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个字符,并删除尾部的括号。
$sth = $this->db->prepare( "SHOW COLUMNS FROM {$table} WHERE Field = '{$field}'" ); $sth->execute(); $type = $sth->fetch()->Type;
。 - Utmost Creator