Proper way to store site wide info
我现在正在用PHP和MySQL构建自己的个人CMS,我不确定存储站点范围变量(如站点名称)的最佳方法。正确的方法是什么?(如果你能提供一个简单的解释,那也很好。;)
编辑:变量需要在CMS中进行编辑。
没有任何"最佳"的解决方案。以下是一些例子,您可以如何做到这一点:
简单PHP文件:
这个解决方案很简单,但不是很灵活:您只需"定义"常量:
1 2 3 | define('SITE_NAME', 'all about Foo'); define ('ADMIN_NAME', 'The Dude'); define ('ADMIN_MAIL', '[email protected]'); |
专家:非常简单。
缺点:更改要求您编辑代码。仅限于平面键(无树/注册表)
INI文件
PHP附带了解析ini文件的函数。以下是PHP手册中的示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | ; This is a sample configuration file ; Comments start with ';', as in php.ini [first_section] one = 1 five = 5 animal = BIRD [second_section] path ="/usr/local/bin" URL ="http://www.example.com/~username" [third_section] phpversion[] ="5.0" phpversion[] ="5.1" phpversion[] ="5.2" phpversion[] ="5.3" |
您可以在多维数组中分析:
1 2 |
意志产出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
优点:词汇化。众所周知的标准语法。
缺点:后端很难编辑
参见:http://php.net/manual/de/function.parse-ini-file.php
简单SQL
另一个简单的方法是,使用数据库来存储圆锥键。表结构为:
1 |
这只是伪代码,我想您需要更多关于PHP和SQL的信息,请随意谷歌它。
SQL树允许您创建类似树的结构。要存档此文件,请使用相同的表结构,但在密钥名称中包含"/":
1 2 |
然后将完整的配置加载到数组中并分析它:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | function parseRawConfig($rawConfig){ $result = array(); foreach($rawConfig as $key => $value){ $nodeNames = explode('/',$key); $nodeCount = count($nodes); $node = $result; for($i=1;$i<$nodeCount;$i++){ if(!array_key_exists($nodeNames[$i],$node)){ $node[$nodeNames[$i]] = array(); } } $node[$nodeNames[$nodeCount-1]] = $value; } return $result; } |
然后您可以这样访问您的密钥:
1 | echo $config['admin']['mail']; |
这使得为后端生成一个好的树视图变得容易,但是要保存更改,您必须"重建"原始路径。
pro:结构化层次数据。
con:复杂,难以实现,需要db连接
XML在XML文件中编写所有圆锥设置。您可以使用特定于应用程序的XML或类似于一般注册表的样式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
PHP提供了大量的类和函数来读/写XML,使用XML可以很容易地创建到其他应用程序的接口。
XML的优缺点是一个巨大的主题。把它们用几句话概括起来。
重要的这些只是一些非常简单的例子,如果您选择其中一个,我建议您深入探讨这个主题!
我的FAV是XML;)
在我看来,最好的方法是将其存储在配置文件中(我使用.in i文件,但您可以很容易地使用下面这样的文件)。
我喜欢将它存储在MySQL数据库中,因为它允许您仍然获取变量(如站点名称或管理电子邮件地址),即使数据库已关闭。
1 2 3 4 5 | <?php define('SITE_NAME','My CMS'); define('SITE_URL','http://www.example.com'); define('ADMIN_EMAIL','[email protected]'); ?> |
编辑:
创建这样的表
1 2 3 4 |
像这样访问它(在每一页的顶部)
1 2 3 4 5 6 7 8 9 10 11 | <?php $config = array(); $query = mysql_query('SELECT * FROM config'); while ($row = mysql_fetch_row($query)) { $key = $row['key']; $value = $row['value']; $config[$key] = $value; } echo $config['name']; ?> |
我通常创建一个包含所有配置变量的表。每一列都将获得其设置含义的明确名称。然后,我使用下面的查询将它存储在单个数组中以便于使用。
1 2 3 4 | <?php $result = mysql_query("SELECT * FROM configtable WHERE siteID=$siteID LIMIT 1"); $siteConfig = mysql_fetch_assoc($result); ?> |
这样就很容易添加新的配置参数,只需向可配置表中添加一列,就可以直接在站点中使用该值。另外,您只有一个变量,因此不会意外地重用配置变量。
任何格式的配置文件。