Xwab
Форумыnavigate_nextПрограммирование на PHP

Грамотная постройка таблицы настроек
Сообщения
Hameleon

Подскажите как грамотно организовать таблицу, которая будет иметь настройки скрипта? Или вообще создавать ли для этого таблицу? У меня есть две идеи:
- Первая (файловая), допустим $config = array(массив с настройками системы); Далее мы его сериализируем и записываем в файл. При выборке настроек делаем так: $config = unserialize(file(file.dat));
- Второй создать таблицу mysql
Где:
Настройка1 = Значение
Настройка2 = Значение
И и.д., тоесть для каждого параметра настройик системы (например, количество сообщений на страницу) Создавать отдельный столбец
Выборку делать так: SELECT * FROM `config` LIMIT 1

Хотелося бы узнать ваше мнение, возможно вы вобще что-то другое посоветуете? Буду благодарен


__________
посл.ред. 09 Фев 2011, 12:19; всего 1 раз 09 Фев 2011, 12:14
Hameleon

Или возможно ко втором варианту для повышения скорости работы стоит добавить еще столбец `id` и задать ему значение 1. И выборку делать так: SELECT * FROM `config` WHERE `id`='1' LIMIT 1

09 Фев 2011, 12:18
JESOD

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

09 Фев 2011, 12:48
Hameleon

JESOD, а как бы стлобцы розбил тогда?

09 Фев 2011, 13:05
Ant0ha

Делать запрос для получения одного значения очень ресурсоемко, я бы получал все значения из таблицы config в массив, потом уже из массива получал бы необходимые ключи. Примерно вот так это реализовано у меня в движке:
1. Таблица
CREATE TABLE IF NOT EXISTS `a_config` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`module` varchar(30) NOT NULL,
`key` varchar(30) NOT NULL,
`value` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

2. Получение данных в массив

$CONFIG = array();
$result = $db->query("SELECT * FROM #__config");
while($item = $db->fetch_array($result)) $CONFIG[$item['module']][$item['key']] = $item['value'];


3. Добавление массива в статический класс конфигурации
Config::set_array($CONFIG);

4. Получение значений конфигурации в любом месте движка
Config::get('module_name', 'config_key');

Сам класс конфига:

class Config {
   /**
    * Статическое хранилище для данных
    */
   protected static $config_data = array();
     
   /**
    * Проверяет существуют ли данные по ключу
    *
    * @param string $name
    * @return bool
    */
   public static function exists($module, $item)
   {
      return isset(self::$config_data[$module][$item]);
   }
     
   /**
    * Возвращает данные по ключу или null, если не данных нет
    *
    * @param string $name
    * @return unknown
    */
   public static function get($module, $item = '')
   {
      if(!empty($item))
         return (isset(self::$config_data[$module][$item])) ? self::$config_data[$module][$item] : null;
      else return (isset(self::$config_data[$module])) ? self::$config_data[$module] : null;
   }
     
   /**
    * Сохраняет данные по ключу в статическом хранилище
    *
    * @param string $name
    * @param mixed $data
    * @return unknown
    */
   public static function set($module, $item, $value)
   {
      return self::$config_data[$module][$item] = $value;
   }
   
   /**
    * Запись массива данных
    *
    * @param $config_array Добавляемый массив данных
    * @return void
    */
   public static function set_array($config_array)
   {
      self::$config_data = array_merge(self::$config_data, $config_array);
   }
}

09 Фев 2011, 13:07
Hameleon

Ant0ha, хм, посмотрел, не очень ли много кода по сути для выборки данных из БД?

09 Фев 2011, 13:17
Ant0ha

Зависит от конкретных задач, это один из вариантов решения. Лично для меня оптимальное.

09 Фев 2011, 13:25
Hameleon

Ant0ha, понимаю. Но стоит ли мне такое вклеивать для получения настроек? Какая выгода из того что ты юзаеш ООП? Вообщем можешь перечислить плюсы твоего варианта?

09 Фев 2011, 13:29
manyrus

Ant0ha, а можно вместо $CONFIG[$item['module']][$item['key']] = $item['value']; и Config::set_array($CONFIG); сделать через магию  красивее получится, и кода меньше

09 Фев 2011, 13:38
Ant0ha

1. Работает модульно. Не будешь путаться от какого модуля какой ключ, можешь получать массивы ключей для конкретного модуля
2. Не нужно создавать поля для каждого ключа настроек
3. Можно получать и назначать значения ключей в любом месте скрипта не пользуясь глобальными переменными.

Сама реализация класса не идеальная, но вполне работоспособная и, главное, удобная.

09 Фев 2011, 13:40
Ответить на тему