Правильный способ хранения информации на сайте - PullRequest
1 голос
/ 17 апреля 2011

Я сейчас создаю свою собственную CMS с помощью PHP и MySql, и я не уверен, что лучше всего хранить переменные в масштабе сайта, такие как имя сайта. Что будет правильным способом? (Если бы вы могли дать краткое объяснение, которое было бы очень приятно.;)

РЕДАКТИРОВАТЬ: переменные должны быть доступны для редактирования из CMS.

Ответы [ 4 ]

2 голосов
/ 17 апреля 2011

Не существует «лучшего» решения для всех целей.Вот несколько примеров, как вы можете это сделать:

Простой файл PHP:

Это решение очень простое, но не очень гибкое: вы просто «определяете» константы:

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

Pro: очень очень просто.

Минусы: изменения требуют редактирования кода.Только плоские ключи (без дерева / реестра)

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
                )

        )

)

Pros: lexible.Хорошо известный стандартный синтаксис.

Минусы: трудно редактировать в бэкэнде

См .: 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'

Затем вы загружаете свою полную конфигурацию в массив и анализируете ее:

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

Это упрощает создание красивого древовидного представления для вашего бэкэнда, но для сохранения изменений вам придется «восстановить» исходный путь.

Pro: структурированные иерархические данные.

Con: Сложный, сложный в реализации, требует подключения к базе данных

XML Запишите все ваши настройки conig в xml-файле.Вы можете использовать специфичный для приложения xml или общий реестр, например 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 предоставляет множество классов и функций для чтения / записи xml, а использование xml действительно упрощает создание интерфейсов для других приложений..

Плюсы / минусы XML - огромная тема.Слишком много, чтобы суммировать их в нескольких предложениях.

ВАЖНО Это всего лишь несколько очень простых примеров, и если вы выберете один, я рекомендую углубиться в тему!

Моя любимая это XML;)

2 голосов
/ 17 апреля 2011

На мой взгляд, лучший способ - сохранить его в конфигурационном файле (я использую файлы .ini, но вы легко можете использовать файл, как показано ниже).

Я предпочитаю хранить его в базе данных MySQL, так как он позволяет вам получать переменные (например, имя сайта или адрес электронной почты администратора), даже если база данных не работает

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

EDIT:

Создать такую ​​таблицу

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'];
?>
0 голосов
/ 17 апреля 2011

Я обычно создаю одну таблицу со всеми переменными конфигурации. Каждый столбец получит четкое название того, что означает его настройка. Затем я использую следующий запрос, чтобы сохранить его в одном массиве для удобства использования.

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

Таким образом, очень легко добавлять новые параметры конфигурации, вам нужно всего лишь добавить столбец в настраиваемый файл, и вы можете напрямую использовать значение на своем сайте. Кроме того, у вас есть только одна переменная, поэтому случайного повторного использования переменной конфигурации не произойдет.

0 голосов
/ 17 апреля 2011

файл конфигурации в любом формате.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...