Php 数组中的下拉列表选项
我在寻求一些“最佳实践”建议 我总是喜欢将下拉列表选项存储在数组中,而不是数据库表中。其中一个主要原因是,按照我的意愿重新安排选项要容易得多。例如,我有这样一个数组:Php 数组中的下拉列表选项,php,Php,我在寻求一些“最佳实践”建议 我总是喜欢将下拉列表选项存储在数组中,而不是数据库表中。其中一个主要原因是,按照我的意愿重新安排选项要容易得多。例如,我有这样一个数组: $sources=array( 1=>'Google', 2=>'Bing', 3=>'Yahoo', ); 这只是一个简单的例子,我放在这里是为了说明我的意思。数组键实际上是表单中提交的值,数组值是下拉选项中显示的文本 提交的值作为一个整数存储在数据库中(如上所述),然后我可以查询数组以获得
$sources=array(
1=>'Google',
2=>'Bing',
3=>'Yahoo',
);
这只是一个简单的例子,我放在这里是为了说明我的意思。数组键实际上是表单中提交的值,数组值是下拉选项中显示的文本
提交的值作为一个整数存储在数据库中(如上所述),然后我可以查询数组以获得相应的文本值显示在页面上
我是以正确的方式进行操作,还是应该将选项存储在数据库中而不是存储在数组中?如果您的选项是静态的,则可以;如果它们是由某个进程生成的,最好存储在数据库中。这样做的缺点是无法保证引用完整性。当然,您只在数据库行中存储整数键是正确的(因此您没有重复存储字符串“Google”),但问题是数据库本身不知道该键的含义 以这种方式编写的代码遇到了三个具体问题 首先,如果一个单独的应用程序想要查询同一个数据库,该怎么办?这不是PHP应用程序的典型情况,但肯定会发生。比如说,如果我想为你的数据编写一个报告引擎,我就必须复制你的一些源代码,以便显示“Google”而不是“1” 即使你预计不会出现另一个这样的应用程序,为什么要完全切断这种可能性呢 其次,在编辑列表时,没有任何警告或流程可以防止您出错。如果您删除选项“3”,认为没有更多的“Yahoo”源,那么您现在的数据库中有无意义的“3”值,无法确定它们的含义 相比之下,如果您试图从数据库查找表中删除“3”,那么如果仍然存在任何匹配行,则会出现外键错误 第三,您不能编写一个自动包含名称的查询。查询必须返回“2”,然后PHP代码必须用“Bing”替换结果集中的每一行。让数据库进行处理通常更容易、更快
现在,这并不是说在PHP中存储这样的值从根本上说是不可接受的,我已经这样做过好几次了,但在大多数情况下,最好将所有数据都存储在同一个数据库中。将它们存储在数组中的一个优点是,如果您需要支持通过基于web的管理页面修改列表
也就是说,您的管理页面可以将新条目发布到数据库中的查找表中,然后应用程序中使用该选项列表的任何部分和所有部分都将立即使用它。如果列表发生更改,可能比修改PHP代码更方便。这取决于列表的类型和使用方式。静态列表不必由用户(例如,通过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
也许在数据库中使用特定ID而不是数字?比如谷歌的G和雅虎的Y等等。也就是说,如果您真的不想使用完整字符串。但我认为把全名输入数据库是最好的选择。嗨,亚历克。是的,我想我可以包括一个sortId字段,但是如果不使用第三方插件,重新安排选项是不够容易的。除非您知道自动更新所有其他记录以使其包含有效的sortId值的方法?