【问题标题】:Proper way to store site wide info存储站点范围信息的正确方法
【发布时间】:2011-04-16 20:48:59
【问题描述】:

我现在正在使用 PHP 和 MySql 构建自己的个人 CMS,但我不确定存储站点范围变量(例如站点名称)的最佳方式。什么是正确的方法? (如果你能提供一个简短的解释,那也很好。;)

编辑:变量需要在 CMS 中进行编辑。

【问题讨论】:

标签: php mysql variables content-management-system


【解决方案1】:

在我看来,最好的方法是将其存储在配置文件中(我使用 .ini 文件,但您可以轻松使用如下文件)。

我更喜欢将其存储在 MySQL 数据库中,因为即使数据库已关闭,它仍允许您获取变量(如站点名称或管理员电子邮件地址)

<?php
    define('SITE_NAME','My CMS');
    define('SITE_URL','http://www.example.com');
    define('ADMIN_EMAIL','admin@example.com');
?>

编辑:

创建一个这样的表

id    key    value
-------------------
1     name   My Cms
2     url    http://www.example.com

并像这样访问它(在每个页面的顶部)

<?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'];
?>

【讨论】:

  • 我需要在 cms 中对其进行编辑...(见编辑)
  • 调整了我的帖子以存储在数据库中
【解决方案2】:

没有适用于所有目的的“最佳”解决方案。 以下是一些示例:

简单的 PHP 文件:

这个解决方案非常简单但不是很灵活: 您只需“定义”常量:

define('SITE_NAME', 'all about Foo');
define ('ADMIN_NAME', 'The Dude');
define ('ADMIN_MAIL', 'dude@foo.com');

专业:非常非常简单。

缺点:更改需要您编辑代码。只有平面键(没有树/注册表)

ini 文件

PHP 带有解析 ini 文件的函数。这是 php 手册中的一个示例:

; 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"

您可以将其解析为多维数组:

$ini_array = parse_ini_file("sample.ini", true);
print_r($ini_array);

将输出:

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

另一种简单的方法,但它使用数据库来存储 conig 密钥。 表结构为:

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

这只是伪代码,如果您需要更多关于 PHP 和 SQL 的信息,请随时 google。

SQL 树 允许您创建树状结构。要存档此文件,您可以使用相同的表结构,但在键名中包含“/”:

admin/name | 'The Dude'
admin/mail | 'dude@foo.com'

然后你将你的 COMPLETE 配置加载到一个数组中并解析它:

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;
}

然后您可以像这样访问您的密钥:

echo $config['admin']['mail'];

这使得为您的后端生成漂亮的树形视图变得很容易,但要保存更改,您必须“重建”原始路径。

专业版:结构化分层数据。

缺点:复杂,难以实现,需要数据库连接

XML 将所有 conig 设置写入 xml 文件。 您可以使用特定于应用程序的 xml 或类似样式的通用注册表:

<cmsConf>
  <site>all about foo</site>
  <admin>
    <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 的优缺点是一个很大的话题。用几句话来概括它们太庞大了。

重要 这些只是一些非常简单的示例,如果您选择其中一个,我建议您深入研究该主题!

我最喜欢的是 XML ;)

【讨论】:

    【解决方案3】:

    你喜欢的任何格式的配置文件。

    【讨论】:

      【解决方案4】:

      我通常创建一个包含所有配置变量的表。每列都将获得其设置含义的清晰名称。然后我使用以下查询将其存储在单个数组中以方便使用。

      <?php
      $result = mysql_query("SELECT * FROM configtable WHERE siteID=$siteID LIMIT 1");
      $siteConfig = mysql_fetch_assoc($result);
      ?>
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-21
        • 1970-01-01
        相关资源
        最近更新 更多