1

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.

codedude
  • 6,244
  • 14
  • 63
  • 99
  • possible duplicate of [PHP: optimum configuration storage ?](http://stackoverflow.com/questions/2623021/php-optimum-configuration-storage) – Pekka Apr 16 '11 at 20:53
  • Related: http://stackoverflow.com/questions/834756/what-is-considered-the-best-practice-to-handle-variables-stored-in-a-configuratio – Pekka Apr 16 '11 at 20:54
  • Related, discussing storing config in databases: http://stackoverflow.com/questions/4997706/configuration-storage-setup-file-vs-db – Pekka Apr 16 '11 at 20:55

4 Answers4

2

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'];
?>
fin1te
  • 4,289
  • 1
  • 19
  • 16
2

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

Oliver A.
  • 2,870
  • 2
  • 19
  • 21
0

a configuration file in whatever format you like.

Yehonatan
  • 1,172
  • 2
  • 11
  • 21
0

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.

Hugo Delsing
  • 13,803
  • 5
  • 45
  • 72