1. Константы и переменные

Константы

  • SED_CODE — Флаг безопасности, определяет что файл загружен через систему
  • SED_ROOT — Корневая директория проекта
  • SED_INDEX, SED_ADMIN, SED_PLUG — Флаги для различных режимов работы

Глобальные массивы

$cfg — Конфигурация системы

$cfg['mainurl']           // Главный URL сайта
$cfg['maintitle']         // Заголовок сайта
$cfg['defaultlang']       // Язык по умолчанию
$cfg['defaultskin']       // Шаблон по умолчанию
$cfg['mysqlhost']         // Хост БД
$cfg['mysqldb']           // Имя БД
// ... и множество других настроек

$sys — Системные переменные

$sys['now']               // Текущее время (timestamp)
$sys['now_offset']        // Время с учетом часового пояса
$sys['unique']            // Уникальный идентификатор
$sys['host']              // Имя хоста
$sys['abs_url']           // Абсолютный URL

$usr — Данные пользователя

$usr['id']                // ID пользователя (0 для гостя)
$usr['name']              // Имя пользователя
$usr['level']             // Уровень доступа
$usr['maingrp']           // Основная группа
$usr['auth']              // Массив прав доступа
$usr['skin']              // Текущий шаблон
$usr['lang']              // Текущий язык

$out — Данные для вывода

$out['subtitle']          // Подзаголовок страницы
$out['pagetitle']         // Заголовок страницы
$out['subdesc']           // Мета-описание
// ... и другие переменные для шаблонов

2. Подключение к базе данных

Система поддерживает два типа подключений:

  • MySQL (system/database.mysql.php) — Устаревший, рекомендуется использовать MySQLi
  • MySQLi (system/database.mysqli.php) — Рекомендуемый тип подключения

Тип подключения определяется в $cfg['sqldb'].

Основные функции работы с БД

// Подключение к базе данных
$connection_id = sed_sql_connect($host, $user, $password, $database);

// Выполнение SQL запроса
$sql = sed_sql_query("SELECT * FROM $db_users WHERE user_id='$id'");

// Получение ассоциативного массива (рекомендуется)
while ($row = sed_sql_fetchassoc($sql)) {
    echo $row['user_name'];
}

// Получение массива с числовыми индексами
$row = sed_sql_fetcharray($sql);
echo $row[0]; // Первое поле

// Получение одного значения
$count = sed_sql_result($sql, 0, 'COUNT(*)');

// Количество строк в результате
$num_rows = sed_sql_numrows($sql);

// Экранирование строки для безопасности (ОБЯЗАТЕЛЬНО!)
$safe_string = sed_sql_prep($user_input);
$sql = sed_sql_query("SELECT * FROM $db_table WHERE title='$safe_string'");

// ID последней вставленной записи
$new_id = sed_sql_insertid();

Важные замечания по безопасности

⚠️ КРИТИЧЕСКИ ВАЖНО: Всегда экранируйте пользовательский ввод перед использованием в SQL запросах:

// ❌ НЕПРАВИЛЬНО - уязвимость к SQL-инъекциям
$title = $_GET['title'];
$sql = sed_sql_query("SELECT * FROM $db_pages WHERE page_title='$title'");

// ✅ ПРАВИЛЬНО - безопасно
$title = sed_sql_prep(sed_import('title', 'G', 'TXT'));
$sql = sed_sql_query("SELECT * FROM $db_pages WHERE page_title='$title'");

Пример работы с транзакциями

// Начало транзакции (если поддерживается)
sed_sql_query("START TRANSACTION");

try {
    // Выполнение операций
    sed_sql_query("INSERT INTO $db_table1 (...) VALUES (...)");
    sed_sql_query("UPDATE $db_table2 SET ... WHERE ...");
    
    // Подтверждение транзакции
    sed_sql_query("COMMIT");
} catch (Exception $e) {
    // Откат при ошибке
    sed_sql_query("ROLLBACK");
}

3. Аутентификация и авторизация

Режимы аутентификации ($cfg['authmode'])

Система поддерживает три режима аутентификации:

  • 1 — Только cookies: Пользовательская сессия хранится только в cookies. Менее безопасно.
  • 2 — Только sessions: Сессия хранится только на сервере. Более безопасно, но требует активных PHP сессий.
  • 3 — Cookies + Sessions (рекомендуется): Комбинация обоих методов для максимальной безопасности и удобства.
// Настройка в datas/config.php
$cfg['authmode'] = 3; // Рекомендуемое значение

Система прав доступа

Функция sed_auth($area, $option, $level) проверяет права доступа:

Параметры:

  • $area — Область (например, 'index', 'page', 'forums', 'plug')
  • $option — Опция проверки:
    • 'R' — Чтение (Read)
    • 'W' — Запись/редактирование (Write)
    • 'A' — Администрирование (Admin)
    • Можно комбинировать: 'RW', 'RWA'
  • $level — Минимальный уровень доступа (например, 'A' для админов)

Возвращает: массив [$auth_read, $auth_write, $isadmin]

Примеры использования:

// Проверка прав на чтение и запись для модуля 'page'
list($usr['auth_read'], $usr['auth_write'], $usr['isadmin']) = sed_auth('page', 'RW');

// Проверка только прав чтения
list($read, $write, $admin) = sed_auth('forums', 'R');

// Проверка прав админа
list($read, $write, $is_admin) = sed_auth('admin', 'A');

// Проверка прав с минимальным уровнем
list($read, $write, $admin) = sed_auth('plug', 'RWA', 'A'); // Только для админов

// Условная проверка прав
if ($usr['auth_read']) {
    // Показать контент
}

if ($usr['auth_write']) {
    // Показать форму редактирования
}

if ($usr['isadmin']) {
    // Показать административные функции
}

// Блокировка доступа если нет прав
if (!$usr['auth_read']) {
    sed_block();
    // или
    sed_redirect(sed_url("message", "msg=403"));
    exit;
}

Структура прав доступа

Права хранятся в массиве $usr['auth'], который имеет структуру:

$usr['auth'] = array(
    'area_name' => array(
        'R' => 1,  // Право на чтение
        'W' => 1,  // Право на запись
        'A' => 0   // Право на администрирование
    ),
    // ... другие области
);

Группы пользователей

Система использует иерархию групп с различными уровнями доступа:

// Группы загружаются в глобальный массив $sed_groups
// Структура группы:
$sed_groups[$grp_id] = array(
    'id' => $grp_id,              // ID группы
    'alias' => 'members',         // Алиас группы
    'level' => 5,                 // Уровень доступа (чем выше, тем больше прав)
    'title' => 'Members',         // Название группы
    'desc' => 'Regular members',  // Описание
    'pfs_maxfile' => 1000000,     // Макс. размер файла в PFS
    'pfs_maxtotal' => 50000000    // Макс. общий размер PFS
);

// Проверка группы пользователя
if ($usr['maingrp'] == 5) {
    // Пользователь является членом группы с ID 5
}

// Получение информации о группе
$group_info = $sed_groups[$usr['maingrp']];
$user_level = $group_info['level'];

Предопределенные группы (обычно):

  • 0 — Гости (Guests) — level 0
  • 3 — Члены (Members) — level 5
  • 4 — Модераторы (Moderators) — level 25
  • 5 — Администраторы (Administrators) — level 99

⚠️ Примечание: ID групп могут отличаться в зависимости от настроек сайта. Всегда проверяйте через $sed_groups, а не жестко задавайте ID.

4. Кэширование

Система кэширования используется для оптимизации производительности и хранения часто используемых данных.

Что кэшируется

  • Группы пользователей (sed_groups) — TTL: 3600 сек (1 час)
  • Плагины (sed_plugins) — TTL: 3300 сек (55 минут)
  • Структура страниц (sed_cat) — TTL: 3600 сек
  • Структура форумов (sed_forums_str) — TTL: 3600 сек
  • Смайлики (sed_smilies) — TTL: 3550 сек
  • Словари (sed_dic) — TTL: 3600 сек
  • Меню (sed_menu) — TTL: 3600 сек

Функции кэширования

// Сохранение данных в кэш
// $name - имя кэша
// $data - данные для сохранения (массив, объект, строка)
// $ttl - время жизни в секундах (time to live)
sed_cache_store('my_cache_name', $data_array, 3600);

// Получение одного элемента из кэша
$cached_data = sed_cache_get('my_cache_name', true); // true = проверять срок действия

// Получение всего кэша (используется в common.php)
$all_cache = sed_cache_getall();

// Очистка конкретного кэша
sed_cache_clear('my_cache_name');

// Очистка всего кэша
sed_cache_clearall();

Практические примеры

// Кэширование результатов запроса
$cache_name = 'popular_pages';
$data = sed_cache_get($cache_name);

if (!$data) {
    // Данных нет в кэше, выполняем запрос
    $sql = sed_sql_query("SELECT * FROM $db_pages WHERE page_state=1 ORDER BY page_count DESC LIMIT 10");
    $data = array();
    while ($row = sed_sql_fetchassoc($sql)) {
        $data[] = $row;
    }
    // Сохраняем в кэш на 1 час
    sed_cache_store($cache_name, $data, 3600);
}

// Используем данные из кэша или БД
foreach ($data as $page) {
    // ...
}

// Кэширование сгенерированного HTML
$html_cache = 'header_html_' . $usr['lang'] . '_' . $usr['skin'];
$html = sed_cache_get($html_cache);

if (!$html) {
    // Генерируем HTML
    $html = sed_generate_header_html();
    // Кэшируем на 30 минут
    sed_cache_store($html_cache, $html, 1800);
}

echo $html;

Рекомендации по использованию кэша

✅ Используйте кэш для:

  • Результатов тяжелых SQL запросов
  • Данных, которые редко изменяются
  • Сгенерированного HTML/контента

❌ Не используйте кэш для:

  • Персональных данных пользователя
  • Временных данных (сессии, токены)
  • Данных, требующих мгновенного обновления

⚠️ Важно: При изменении данных в БД обязательно очищайте соответствующий кэш, иначе пользователи будут видеть устаревшую информацию.

Оценка:

Пока комментариев нет