2010-10-01 97 views
-1

我在这里接受了一些“最佳实践”建议。阵列中的下拉列表选项

我一直倾向于将下拉列表选项存储在数组中,而不是数据库表中。其中一个主要原因是,按我的意愿重新安排选项要容易得多。比如我有一个这样的数组:

$sources=array(
    1=>'Google', 
    2=>'Bing', 
    3=>'Yahoo', 
); 

这只是一个简单的我已经把这里说明我的意思。数组键实际上是在表单中提交的值,数组值是出现在下拉选项中的文本。

提交的值作为整数(如上所示)存储在数据库中,然后我可以查询数组以获取相应的文本值以显示在页面上。

我会以正确的方式解决这个问题,还是应该将选项存储在数据库而不是数组中?

回答

1

这样做的缺点是没有办法保证参照完整性。当然,你只在数据库行中存储整数键是正确的(所以你不会重复存储字符串“Google”),但问题是数据库本身不知道这个键的含义。

我遇到了用这种方式编写的代码的三个具体问题。

首先,如果单独的应用程序想要查询同一个数据库会怎么样?这对PHP应用程序来说并不典型,但它肯定会发生。如果我想为数据编写报表引擎,则必须复制源代码的各个位以显示“Google”而不是“1”。

即使你不希望另一个这样的应用出现,为什么完全切断了可能性?

其次,没有警告或过程来防止编辑列表时出错。如果删除选项“3”,认为没有更多的“雅虎”资源,那么现在您的数据库中就会出现无意义的“3”值,无法确定它们的含义。

相比之下,如果您试图从数据库查找表中删除“3”,如果任何匹配的行仍然存在,您将会遇到外键错误。

第三,您不能编写自动包含名称的单个查询。你的查询必须返回“2”,你的PHP代码必须用结果集中的每一行代替“Bing”。让数据库执行该处理通常更简单快捷。

现在,这并不是说在PHP中存储这样的值是基本上不可接受的,而且我已经做了好几次,但是对于大多数情况下,最好将所有数据都放在同一个数据库中。

1

这是好的,如果你的选择是静态的;如果它们是由某个进程生成的,那么存储在数据库中会更好。

0

将它们存储在数组中的一个好处是如果您需要支持通过基于Web的管理页面修改列表。

也就是说,您的管理页面可以将新条目发布到数据库中的查找表中,然后使用该列表选项的应用程序的任何部分都将立即使用它。如果列表更改,可能比修改PHP代码更容易。

1

这取决于列表的种类以及如何使用它们。例如不需要维护的静态列表用户通过CMS,并且不需要在查询中引用它们,也可以在代码中的数组中生存。检索相应值的简单方法是使用可在需要这些值的任何位置调用的函数。例如:

function source_name($key) { 
    $sources=array(
    1=>'Google', 
    2=>'Bing', 
    3=>'Yahoo', 
); 
    return $sources[$key]; 
}

但它可能是最好将这些值存储在数据库中,这样就可以直接从数据库中检索数据,而不必依赖于包括您所需要的信息,具体的脚本。您可以将sortId添加到您存储项目的表格中,并按照该顺序显示它们。

`sources` 
id name  sortId 
1 Google 1 
2 Bing  2 
3 Yahoo 3 

// retrieve sources 
SELECT id, name FROM sources ORDER BY sortId 

`data` 
id sourceId 
1 1 
2 2 
3 2 
4 3 
5 3 

// retrieve stored data, including the associated source name 
SELECT data.sourceId, sources.name 
FROM data 
INNER JOIN sources 
ON data.sourceId = sources.id
+0

嗨亚历克。是的,我想我可以包含一个sortId字段,但重新排列选项并不容易,不需要使用第三方插件。除非你知道一种方法会自动更新所有其他记录,以便它们包含有效的sortId值? – GSTAR 2010-10-01 18:17:53

-1

也许在数据库中使用特定的ID而不是数字?像G代表谷歌,Y代表雅虎等。也就是说,如果你真的不想使用完整的字符串。但我认为只要将全名放入数据库是最好的选择。