Своя cms на php

Здрастуй мій юний кодер, сьогодні МИ з тобою почнемо писати свою простеньку CMS.
Отже, з чого почнемо ... природно з проектування. Що повинна вміти / мати не круто, простенька CMS? Це питання досить складне, тому що будь-яка CMS, навіть найпростіша, пишеться під конкретні потреби: електронний магазин, программерскую сайт, новинний сайт, галерея (хоча, в принципі, галерея- це не зовсім CMS) і т.д. У цій статті ми розглянемо другий варіант. Що ж повинна вміти така CMS? Думаю всі зі мною погодяться, що:

Спочатку організуємо структуру директорій майбутнього сайту:
/ DocumentRoot
/ AdminPanel # Коренева директорія адмінки
/ Sources # Скрипти адмінки
/ HTML # Власне сам хтмл адмінських сторінок управління
/ Sources # Скрипти CMS
/ HTML # ХТМЛ
/ Images # Зображення
/ Downloads # Директорія зберігає в собі файли доступні для скачування
/ Config # Файли конфігурації CMS, наприклад містять логін і пароль доступу до MySQL

Код файлу index.php:

require_once ( 'config / database.php'); // Завантажуємо скрипт з'єднується з БД
require_once ( 'sources / session.php'); // Скрипт управління сеансами користувачів
require_once ( 'config / config.php'); // Файл конфігурації
require_once ( 'sources / check.php'); // Перевіряє одержувані з URL'a параметри
require_once ( 'sources / links'); // Відповідає за посилання для навігації по сайту

$ Act = check_act ($ debug); // Функція перевірки змінної $ act, знаходиться в файлі check.php
$ Mod = @ $ _ GET [ 'mod']; // Отримуємо змінну $ mod
$ Site_links = get_links ($ mysql_tables); // Отримуємо масив посилань
switch ($ act)
case 'idx': // якщо відвідувач переглядає головну сторінку сайту
require_once ( 'sources / news.php'); // Завантажуємо скрипт новин
$ Site_news = get_news ($ mysql_tables); // Отримуємо масив новин
require_once ( 'HTML / index.htm'); // Завантажуємо ХТМЛ сторінки
break;
>
?>

Код файлу database.php:


$ Mysql_login = 'root'; // Логін для доступу до сервера БД
$ Mysql_pass = ''; // Пароль
$ Mysql_host = 'localhost'; // Хост на якому висить MySQL
$ Mysql_database = 'MyCMS'; // Ім'я БД

Код файлу session.php:

if (! @ $ _ SESSION [ 'group_id']) // Якщо користувач тільки що зайшов
<
$ _SESSION [ 'user'] = 'Гість';
$ _SESSION [ 'id'] = 0;
$ _SESSION [ 'group_id'] = - 1;
$ _SESSION [ 'last_click'] = $ time;
>

if (@ $ _ SESSION [ 'group_id']<>'') // якщо відвідувач не гість
<
$ _SESSION [ 'last_click'] = $ time; // в подальшому нам це знадобиться для обліку онлайн- користувачів на сайті
>

Код файлу check.php:


function check_act ($ debug) // Функція перевірки змінної act
$ Act = @ $ _ GET [ 'act'];
if ($ act<>'Idx')
$ Act = $ debug [ 'indx_act']; // Задаємо дефолтний значення
>
return $ act;
>

Код файлу config.php:


// Установки управління виправленням помилок:
$ Debug [ 'indx_act'] = 'idx'; // Якщо головний скрипт отримає неправильне значення переменнной act то він задасть їй це значення

Код файлу links.php:

function get_links ($ table)
$ Query = "SELECT position FROM $ table";
$ Result = mysql_query ($ query);
$ Rows = mysql_num_rows ($ result);
for ($ i = 0; $ i<$rows; $i++)
$ Sort_array [$ i] = mysql_result ($ result, $ i);
>
sort ($ sort_array);
for ($ j = 0; $ j<$rows; $j++)
$ Pos = $ sort_array [$ j];
$ Query = "SELECT * FROM $ table WHERE position = '$ pos'";
$ Result = mysql_query ($ query);
$ Tmp_arr = mysql_fetch_array ($ result);
$ Links [$ j] [ 'name'] = $ tmp_arr [ 'name'];
$ Links [$ j] [ 'link'] = $ tmp_arr [ 'link'];
>
$ Links [ 'rows'] = $ rows-1;
return $ links;
>

Ось в принципі вже і міні рухав вийшов :) Тепер давайте розберемо код деяких файлів, щоб я вам пояснив механізм роботи. Отже для чого я перевіряю змінну $ act запитаєте ви? А уявіть собі що хтось захоче в url'e її поміняти? Після цього скрипт може працювати нестабільно і цілком реальна псування даних і т.п. Звичайно в даному прикладі це грає, м'яко кажучи, другорядну роль, але запам'ятайте, що потрібно перевіряти абсолютно все що може змінити користувач (краще навіть перевіряти то що він в принципі і не може змінювати). Якщо ж у змінної якесь ліве значення то ми їй присвоюємо дефолтний значення і тим самим обламувати шкідливих кіддісов :)

Ось власне і все. До речі, деякі люди які Новомосковскют зараз цю статтю, напевно, возмутяться: "А чому в запиті не використовувати конструкцію ORDER BY і не використовувати пов'язані таблиці? Адже це спростить завдання! ". Справа в тому, що стиль написання моїх скриптів полягає в тому щоб максимально збільшити їх переносимість, тобто я ніколи не використовую складні запити, пов'язані таблиці і т.д. Звичайно, все це погано позначається на швидкості роботи скриптів і їх супроводі (занадто не зрозуміло код), і якщо потрібно домогтися максимальної продуктивності на шкоду переносимості, то я використовую всі ці кошти, але зате ще жоден мій скрипт при переїзді не просто з однієї версії MySQL на іншу, а з однієї платформи і / або типу веб серверів і серверів БД не видав жодної помилки або попередження :) Кожен має право робити так як він хоче, адже на те вона і програмування: можливих рішень задачі, стільки ж скільки і людей намагаються її виріши ь;)