关于php:存储网站信息的正确方法

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
$ini_array = parse_ini_file("sample.ini", true);
print_r($ini_array);

意志产出:

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
Array
(
    [first_section] => Array
        (
            [one] => 1
            [five] => 5
            [animal] => Dodo bird
        )

    [second_section] => Array
        (
            [path] => /usr/local/bin
            [URL] => http://www.example.com/~username
        )

    [third_section] => Array
        (
            [phpversion] => Array
                (
                    [0] => 5.0
                    [1] => 5.1
                    [2] => 5.2
                    [3] => 5.3
                )

        )

)

优点:词汇化。众所周知的标准语法。

缺点:后端很难编辑

参见:http://php.net/manual/de/function.parse-ini-file.php

简单SQL

另一个简单的方法是,使用数据库来存储圆锥键。表结构为:

1
config{config_name UNIQUE KEY VARCHAR[64] ; config_value VARCHAR[128]}

这只是伪代码,我想您需要更多关于PHP和SQL的信息,请随意谷歌它。

SQL树允许您创建类似树的结构。要存档此文件,请使用相同的表结构,但在密钥名称中包含"/":

1
2
admin/name | 'The Dude'
admin/mail | '[email protected]'

然后将完整的配置加载到数组中并分析它:

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
<cmsConf>
  <site>all about foo</site>
 
    <name>The Dude</name>
    <mail>dude@foo.com</mail>
  </admin>
</cmsConf>

<reg>
<key name="site">all about foo</key>
<node name="admin">
  <key name="name">The Dude</key>
  <key name="mail">dude@foo.com</key>
</node>
</reg>

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
id    key    value
-------------------
1     name   My Cms
2     url    http://www.example.com

像这样访问它(在每一页的顶部)

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);
?>

这样就很容易添加新的配置参数,只需向可配置表中添加一列,就可以直接在站点中使用该值。另外,您只有一个变量,因此不会意外地重用配置变量。


任何格式的配置文件。