我正在使用information_schema.columns表来获取一些信息。
我只是想知道这是不是一个坏主意,是否有更好的选择。
if($column['DATA_TYPE'] === 'enem'){
$options = eval(str_replace('enem(', 'array(', $column['COLUMN_TYPE']));
}
我选择使用eval和单个str_replace,因为我认为这是创建数组的最快方法。
以下是$column
可能看起来像的示例
$column = array(
['COLUMN_NAME'] => 'status',
['COLUMN_TYPE'] => "enum('failed','success','pending','other')",
['DATA_TYPE'] => 'enum',
);
我认为您的第二个解决方案要清楚得多,速度和内存性能的差异将很小。(您也可以使用RegExp)
这里有一个链接可以帮助你:
如何在MySQL数据库中获取枚举可能的值?
这里有一个不是eval的替代方案,可能没有eval那么快,但仍然很快
if($column['DATA_TYPE'] === 'enem'){
$enums = str_replace(array('enum(', ')'), '', $column['COLUMN_TYPE']);
$options = explode(',', $enums);
}
可能需要进行更多的检查,但它适用于enum('failed','success','pending','other')
在这种情况下不使用eval()的唯一真正原因是,您希望您的代码在例如Facebook的HHVM上运行,它不支持eval-afaik。然而,我认为在你的特殊案件中没有安全问题。
然而,如果您只是稍微更改代码,就可以使用json_decid:
$options = json_decode('['.substr($column['COLUMN_TYPE'], 5, -1).']);
如果不做一个小的基准测试,很难判断哪个更快。我怀疑这会更快,因为str_replace必须搜索整个字符串。