数组中的下拉列表选项

时间:2010-10-01 17:46:19

标签: php

我在这里接受了一些“最佳实践”建议。

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

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

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

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

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

5 个答案:

答案 0 :(得分:1)

如果您的选项是静态的,那就没关系;如果它们是由某个过程生成的,那么存储在数据库中要好得多。

答案 1 :(得分:1)

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

我遇到了以这种方式编写的代码的三个特定问题。

首先,如果一个单独的应用程序想要查询同一个数据库怎么办?这对于PHP应用程序来说并不常见,但肯定会发生。如果我想为您的数据编写报告引擎,我必须复制源代码的一部分才能显示“Google”而不是“1”。

即使你没有预料到另一个这样的应用程序出现了,为什么要完全切断这种可能性呢?

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

相比之下,如果您尝试从数据库查找表中删除“3”,如果仍然存在匹配的行,则会出现外键错误。

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

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

答案 2 :(得分: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

答案 3 :(得分:0)

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

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

答案 4 :(得分:-1)

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