Php 仅使用SQL获取MySQL枚举的值
在web应用程序中,我需要使用MySQL枚举的所有可能值填充Php 仅使用SQL获取MySQL枚举的值,php,mysql,sql,enums,Php,Mysql,Sql,Enums,在web应用程序中,我需要使用MySQL枚举的所有可能值填充 当我执行以下任一项时: 显示mytable中的列,如“mycolumn”; 从信息\u SCHEMA.COLUMNS中选择列\u类型 其中TABLE_NAME='mytable'和COLUMN_NAME='mycolumn'; 我总是以enum('valueA','valueB','valueC')结束 我知道我可以用PHP解析它,但是只能用SQL吗? 我需要这样的东西: +-----------------+ | values
当我执行以下任一项时:
显示mytable中的列,如“mycolumn”;
从信息\u SCHEMA.COLUMNS中选择列\u类型
其中TABLE_NAME='mytable'和COLUMN_NAME='mycolumn';
我总是以enum('valueA','valueB','valueC')
结束
我知道我可以用PHP解析它,但是只能用SQL吗?
我需要这样的东西:
+-----------------+
| values |
+-----------------+
| valueA |
| valueB |
| valueC |
+-----------------+
+-----------------+
|价值观|
+-----------------+
|瓦卢亚|
|瓦卢布|
|瓦卢克|
+-----------------+
这是Chris Komlenic的作品之一: 4。获取不同枚举成员的列表是一件痛苦的事情。 一个非常常见的需求是用数据库中可能的值填充一个选择框或下拉列表。像这样: 选择颜色:
[选择框]
如果这些值存储在名为“colors”的引用表中,则只需:SELECT*FROM colors
…然后将其解析以动态生成下拉列表。您可以在参考表中添加或更改颜色,您的性感订单将自动更新。太棒了
现在考虑邪恶枚举:你如何提取成员名单?您可以查询表中的ENUM列以查找不同的值,但这将只返回实际使用并显示在表中的值,而不一定返回所有可能的值。您可以使用脚本语言查询信息并从查询结果中解析它们,但这是不必要的复杂。事实上,我不知道有哪种优雅、纯粹的SQL方法可以提取枚举列的成员列表
虽然我同意大多数情况下不使用枚举,但在一条SQL语句中也可以:-
SELECT DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING(COLUMN_TYPE, 7, LENGTH(COLUMN_TYPE) - 8), "','", 1 + units.i + tens.i * 10) , "','", -1)
FROM INFORMATION_SCHEMA.COLUMNS
CROSS JOIN (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units
CROSS JOIN (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens
WHERE TABLE_NAME = 'mytable'
AND COLUMN_NAME = 'mycolumn'
这将适用于最多有100个可能值的枚举这是最简单的解决方案
$EnumColum = $mysqli->query(
$link,
"SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'mrb_shipping_carriers' AND COLUMN_NAME = 'uspsServiceType'"
) or die("Error in " . ": " . __FILE__ . ": " . __LINE__);
$replace1 = preg_replace("/enum/", '',$EnumColum[0]['COLUMN_TYPE']);
$replace2 = preg_replace("/\(/", '',$replace1);
$replace3 = preg_replace("/\)/", '',$replace2);
$replace4 = preg_replace("/\'/", '',$replace3);
$newArray = explode(',',$replace4);
foreach($newArray as $value){
echo $value . "\n<br>";
}
$EnumColum=$mysqli->query(
$link,
“从信息\u SCHEMA.COLUMNS中选择列\u类型
其中,表_NAME='mrb_shipping_carriers'和列_NAME='USPServiceType'”
)或者死(“文件中的错误:”):“;
$replace1=preg_replace(“/enum/”,“”,$enumcolm[0]['COLUMN_TYPE']);
$replace2=preg\u replace(“/\(/”,“$replace1”);
$replace3=preg\u replace(“/\)/”,“$replace2);
$replace4=preg\u replace(“/\”/“,”$replace3);
$newArray=explode(“,”,$replace4);
foreach($newArray作为$value){
回显$value。“\n
”;
}
Ugh可能重复,这是我担心的。如果一个或多个值包含,'
?请参阅。虽然可以通过替换嵌入的、
(存储为”、
)和其他一些faff来解决,但这会导致问题。无论哪种方法都是可能的,即使这是避免使用枚举的一个很好的理由。非常感谢!我知道一定有办法,尽管我的SQL技能还没有发展到足以让我自己找到它。是的,我完全同意不使用枚举,但有时您无法更改当前系统的构建方式。这是可能的,但我建议您修改表以避免使用枚举。我上面的代码可能不会很快,也不是我想在任何常用页面上使用的东西。可能更好的方法是使用它来提取值,以填充系统可以修改为使用的可能值的表。@gumgl:我想更一般的观察是,如果可能值嵌入到数据库架构中(就像它们在枚举
列的定义中一样),然后,它们也可以嵌入到一个人的代码中。模式的更改总是需要更改代码库。如果您不愿意将选项嵌入到自己的代码中,则表明它们预期会更改/打算成为动态的-在这种情况下,首先使用的ENUM
完全是错误的数据类型。