开发者

Proper way to store site wide info

I'm building my own personal CMS right now with PHP and MySql and I'm not sure of the best way to store site-wide开发者_高级运维 variables such as the site name. What would be the proper way? (If you could provide a brief explanation that would be really nice too. ;)

EDIT: The variables would need to be editable from within the CMS.


In my opinion the best way is to store it in a config file (I use .ini files, but you could easily use a file like below).

I prefer this to storing it in a MySQL database, as it allows you to still get variables (like site name, or admin email address) even if the database is down

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

EDIT:

Create a table like this

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

And access it like this (at the top of every page)

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


There is no "best" sollution for all purposes. Here are some examples how you can do this:

Simple PHP file:

This sollution is very simple but not very flexible: you just 'define' constants:

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

Pro: very very simple.

Cons: changes require that you edit the code. Only flat keys (no tree/registry)

ini File

PHP comes with functions to parse ini files. Here is an example rom the php manual:

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

you can parse this in a multi dimensional array:

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

Will output:

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
                )

        )

)

Pros: lexible. A well known standart syntax.

Cons: Hard to edit in backend

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

Simple SQL

Another simple aproach, but this uses a database to store the conig keys. The table structure is:

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

This is only pseudo code and i you need more information about PHP and SQL feel free to google it.

SQL Tree Allows you to create a tree like structure. To archive this you use the same table structure but include '/' in your key names:

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

Then you load your COMPLETE config in an array and parse it:

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

Then you can access your keys like this:

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

This makes it easy to generate a nice tree view for your backend, but to save the changes you will have to 'reconstruct' the original path.

Pro: structured hierarchical data.

Con: Complicated, hard to implement, requires db connection

XML Write all your conig settings in a xml file. You can either use a app specific xml or a generic registry like style:

<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 provides plenty of classes and functions for reading/writting xml, and using xml makes it really easy to create interfaces to other applications.

The pros/cons of xml are a huge topic. To huge to sum them up in a few sentences.

IMPORTANT These are just some very simple examples and if you choose one I recommend you dig deeper into the topic!

My fav is XML ;)


a configuration file in whatever format you like.


I usually create one table with all config variables. Every column will get a clear name of what its setting means. Then I use the following query to store it in a single array for easy use.

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

This way it is very easy to add new config parameters, you only need to add a column to the configtable and you can directly use the value in your site. Plus you only have one variable so an accidental reuse of a config variable wont happen.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜