Как сделать сайт на чистом PHP с нуля: пошагово

Kuznya Studio 18.09.2026 0

Многие думают, что для сайта нужен фреймворк: Laravel, Symfony, Yii. Мол, без них никак. Это неправда. Простой сайт на чистом PHP работает быстрее, легче и надёжнее любого фреймворка. Разберём по шагам — что нужно знать и как построить свой сайт без зависимостей.

Что такое «сайт на чистом PHP»

Это сайт, в котором:

  • Нет composer и сторонних библиотек
  • Нет фреймворка и его слоёв абстракции
  • Нет сборщиков, npm, node_modules
  • Только PHP + MySQL + HTML + CSS + чуть-чуть JS

Такой сайт работает на любом хостинге за 200 ₽/мес. Не требует VPS, Docker, CI/CD. Загрузил по FTP — работает.

Минимальный стек

ЧтоЧем закрывается
BackendPHP 8.1+
База данныхMySQL / MariaDB через PDO
FrontendHTML5 + CSS3 + ванильный JS
Веб-серверApache с mod_rewrite
ХостингShared, от 200 ₽/мес

Шаг 1. Структура проекта

/public_html/
├── index.php              ← главная
├── about.php              ← другие страницы
├── contact.php
├── includes/
│   ├── config.php         ← настройки, подключение к БД
│   ├── header.php
│   └── footer.php
├── .htaccess              ← правила ЧПУ
└── assets/
    ├── css/style.css
    └── js/script.js

Шаг 2. Подключение к базе

Создаём includes/config.php:

<?php
$pdo = new PDO(
    'mysql:host=localhost;dbname=mydb;charset=utf8mb4',
    'user',
    'pass',
    [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_EMULATE_PREPARES => false,
    ]
);

Важно: EMULATE_PREPARES = false — без этого prepared statements работают небезопасно.

Шаг 3. Первая страница

<?php
require_once __DIR__ . '/includes/config.php';

$pageTitle = 'Главная';
require_once __DIR__ . '/includes/header.php';
?>
<h1>Привет, мир!</h1>
<?php require_once __DIR__ . '/includes/footer.php';

Шаг 4. Красивые URL через .htaccess

RewriteEngine On

# /about/ → /about.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-z0-9\-]+)/?$ $1.php [L]

Теперь /about/ открывает about.php.

Шаг 5. Работа с данными

Пример: вывести список статей блога.

<?php
$stmt = $pdo->query("SELECT id, title, slug FROM blog WHERE status = 1");
$posts = $stmt->fetchAll();
?>
<ul>
    <?php foreach ($posts as $post): ?>
        <li><a href="/blog/<?= $post['slug'] ?>/"><?= htmlspecialchars($post['title']) ?></a></li>
    <?php endforeach; ?>
</ul>

Всё просто. Никаких ORM, никаких ActiveRecord. Один запрос — один результат.

Шаг 6. Безопасность

Минимум, что нужно сделать в любом случае:

  • PDO prepared statements — от SQL-инъекций
  • htmlspecialchars() при выводе — от XSS
  • CSRF-токен на всех формах — от CSRF
  • session_set_cookie_params() с secure, httponly, samesite
  • .htaccess Require all denied на служебные папки
  • Заголовки безопасности — HSTS, X-Frame-Options, X-Content-Type

Шаг 7. Когда нужен фреймворк

Фреймворк нужен, когда:

  • Команда 10+ разработчиков
  • Много интеграций и API
  • Нужны очереди, консольные команды, тесты
  • Сложная бизнес-логика (CRM, ERP)

Для обычного сайта-визитки, блога, каталога, лендинга — фреймворк лишний.

Что делать дальше

Можно собрать свой мини-движок по такому принципу за 2-3 дня. Это базовые 200-300 строк кода: роутинг, шаблоны, БД, авторизация, формы.

Если не хочешь изобретать велосипед — готовые самописные CMS уже собирают всю эту рутину. Например, Kuznya CMS — сделан на том же принципе, что описано выше: чистый PHP, без фреймворков, без Composer.