%

начни
бесплатно

13:08:15

6 дней

%

Все статьи

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

Как сделать админку на PHP с авторизацией, подключением к базе, управлением данными и защитой от несанкционированного доступа

Создаем админку сайта на PHP с нуля
Создаем админку сайта на PHP с нуля

Если вы планируете освоить веб-разработку всерьез, умение создавать административные панели — навык обязательный. Админка позволяет управлять контентом сайта без доступа к коду, а значит, облегчает жизнь вам и вашим будущим заказчикам. В этой статье мы разберем, как с нуля написать простую, но функциональную админку на PHP, используя MySQL и немного HTML/CSS. Вы получите рабочий прототип, который сможете дорабатывать и использовать в своих проектах.

1. Подготовка окружения

Прежде чем писать код, необходимо подготовить базу: сервер, структуру проекта и подключение к базе данных.

1.1. Установка локального сервера

Для разработки сайта с серверной логикой нужен локальный сервер. Самый популярный вариант — XAMPP. Он включает Apache, PHP и MySQL. Скачайте дистрибутив с официального сайта, установите и запустите Apache и MySQL. Если вы используете macOS, подойдет MAMP.

1.2. Создание проекта

Создайте папку с названием проекта в каталоге htdocs (если у вас XAMPP). Например: my_admin_panel. Внутрь заведите структуру:

/my_admin_panel
|-- index.php
|-- login.php
|-- logout.php
|-- admin/
    |-- dashboard.php
    |-- create.php
    |-- edit.php
    |-- delete.php
|-- includes/
    |-- db.php
    |-- auth.php
    |-- header.php
    |-- footer.php

Данная структура делает проект удобным для масштабирования. Все вспомогательные файлы находятся в includes, а административная логика — в отдельной папке.

1.3. Создание БД

Откройте phpMyAdmin (чаще всего по адресу http://localhost/phpmyadmin), создайте новую базу данных с названием, например, admin_demo, и выполните SQL-запрос:

-- Создаем таблицу пользователей для авторизации
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,         -- Уникальный ID пользователя
    username VARCHAR(50) NOT NULL UNIQUE,      -- Логин (уникальный)
    password VARCHAR(255) NOT NULL,            -- Захешированный пароль
    role VARCHAR(20) DEFAULT 'admin'           -- Роль, по умолчанию — админ
);


-- Добавляем первого пользователя с заранее захешированным паролем
INSERT INTO users (username, password) VALUES (
    'admin',
    '$2y$10$e0NRJk0whd1Vh2M3FJtYkOasB5iWmwlBQy5G1B5L7Y8cD2P7twOeC'
);

Пароль уже зашифрован с помощью password_hash('admin123', PASSWORD_DEFAULT). Это означает, что логин — admin, а пароль при входе — admin123.

1.4. Настройка подключения к базе

Чтобы связать сайт с базой данных, создайте файл includes/db.php и добавьте следующий код:

<?php
// Данные для подключения к базе
$host = 'localhost';
$database = 'admin_demo';
$username = 'root';         // Стандартный логин для локального сервера
$password = '';             // Обычно пароль пустой, если не меняли
$charset = 'utf8mb4';       // Кодировка для поддержки Unicode


// Формируем DSN-строку для PDO
$dsn = "mysql:host=$host;dbname=$database;charset=$charset";


// Настройки PDO для обработки ошибок и получения ассоциативных массивов
$options = [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,         // Показывать ошибки в явном виде
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC     // Возвращать только именованные ключи
];


// Пробуем установить соединение
try {
    $pdo = new PDO($dsn, $username, $password, $options);
} catch (PDOException $e) {
    // Если не удалось подключиться — выводим сообщение и прерываем выполнение
    die('Не удалось подключиться к базе данных');
}
?>

Здесь используется PDO — современный способ взаимодействия с MySQL. Он делает код гибким, безопасным и легко читаемым.

Настройка подключения к MySQL через PDO
Настройка подключения к MySQL через PDO

2. База данных

2.1. Основные таблицы

У нас уже есть таблица users, теперь создадим таблицу для хранения записей. В дальнейшем вы сможете расширить структуру под любые типы данных от новостей до товаров.

-- Таблица для хранения статей
CREATE TABLE posts (
    id INT AUTO_INCREMENT PRIMARY KEY,   -- Уникальный ID статьи
    title VARCHAR(255) NOT NULL,         -- Заголовок статьи
    content TEXT NOT NULL,               -- Основной текст
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP  -- Дата создания по умолчанию
);

2.2. Добавление демонстрационных данных

Чтобы сразу видеть наполнение в админке, внесем пару записей в таблицу:

-- Добавляем тестовые статьи
INSERT INTO posts (title, content) VALUES
('Пример статьи №1', 'Это тестовый материал, добавленный через SQL.'),
('Пример статьи №2', 'Еще один пример записи для проверки.');

Эти данные появятся в таблице при первом открытии админки, и вы сможете попробовать функции редактирования и удаления без ручного ввода.

3. Аутентификация

Аутентификация — ключевой механизм безопасности в любой админ-панели. В этом разделе мы покажем, как реализовать систему входа с формой, проверкой данных, защитой страниц и возможностью выйти из системы. В результате только авторизованные пользователи смогут попасть в закрытую часть сайта.

3.1. Форма входа

Создайте файл login.php. В нем будет простая HTML-форма:

<form method="POST" action="login.php">
    <label>Логин:</label>
    <input type="text" name="username" required>
    <label>Пароль:</label>
    <input type="password" name="password" required>
    <button type="submit">Войти</button>
</form>

3.2. Обработка входа

Добавьте в начало login.php код обработки формы:

<?php
session_start();
require 'includes/db.php';


if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
    $stmt->execute([$_POST['username']]);
    $user = $stmt->fetch();


    if ($user && password_verify($_POST['password'], $user['password'])) {
        $_SESSION['user'] = $user;
        header('Location: admin/dashboard.php');
        exit;
    } else {
        echo 'Неверный логин или пароль';
    }
}
?>

3.3. Защита страниц

Создайте файл includes/auth.php, в котором будет проверка авторизации:

<?php
session_start();


if (!isset($_SESSION['user'])) {
    header('Location: ../login.php');
    exit;
}
?>

На каждую страницу админки вставляйте require '../includes/auth.php'; — это защитит доступ.

3.4. Выход из системы

Создайте файл logout.php с кодом и сохраните его рядом с :

<?php
session_start();
session_destroy();
header('Location: login.php');
exit;
?>

Теперь вы можете входить в админку, выходить и ограничивать доступ посторонним.

Нет времени читать статью?

Получите ответы от практикующих специалистов на бесплатном занятии в вашем городе

Нажимая на кнопку, я соглашаюсь на обработку персональных данных

4. Главная страница админки

Создайте файл admin/dashboard.php. Это будет «главная» админки, на которую попадает пользователь после входа. Вставьте защиту и простую навигацию:

<?php
require '../includes/auth.php';
?>


<h1>Добро пожаловать, <?php echo $_SESSION['user']['username']; ?>!</h1>


<ul>
    <li><a href="posts.php">Управление статьями</a></li>
    <li><a href="../logout.php">Выход</a></li>
</ul>

Функционал здесь минимальный, но с него легко начать: ссылки ведут к нужным разделам, а при необходимости панель можно расширить.

Экран с приветствием и навигацией панели управления
Экран с приветствием и навигацией панели управления

5. CRUD-интерфейс

5.1. Просмотр записей

Создайте файл admin/posts.php. Это список всех статей:

<?php
require '../includes/auth.php';
require '../includes/db.php';


$posts = $pdo->query("SELECT * FROM posts ORDER BY created_at DESC")->fetchAll();
?>


<h2>Статьи</h2>
<a href="create.php">Добавить новую</a>


<table>
    <tr>
        <th>ID</th><th>Заголовок</th><th>Дата</th><th>Действия</th>
    </tr>
    <?php foreach ($posts as $post): ?>
        <tr>
            <td><?= $post['id'] ?></td>
            <td><?= htmlspecialchars($post['title']) ?></td>
            <td><?= $post['created_at'] ?></td>
            <td>
                <a href="edit.php?id=<?= $post['id'] ?>">Редактировать</a>
                <a href="delete.php?id=<?= $post['id'] ?>" onclick="return confirm('Удалить запись?');">Удалить</a>
            </td>
        </tr>
    <?php endforeach; ?>
</table>

5.2. Добавление записи

Создайте файл admin/create.php:

<?php
require '../includes/auth.php';
require '../includes/db.php';


if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $stmt = $pdo->prepare("INSERT INTO posts (title, content) VALUES (?, ?)");
    $stmt->execute([$_POST['title'], $_POST['content']]);
    header('Location: posts.php');
    exit;
}
?>


<h2>Новая статья</h2>
<form method="POST">
    <input type="text" name="title" placeholder="Заголовок" required>
    <textarea name="content" placeholder="Текст" required></textarea>
    <button type="submit">Сохранить</button>
</form>

5.3. Редактирование записи

Теперь понадобится файл admin/edit.php:

<?php
require '../includes/auth.php';
require '../includes/db.php';


$id = $_GET['id'];
$stmt = $pdo->prepare("SELECT * FROM posts WHERE id = ?");
$stmt->execute([$id]);
$post = $stmt->fetch();


if (!$post) exit('Запись не найдена');


if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $stmt = $pdo->prepare("UPDATE posts SET title = ?, content = ? WHERE id = ?");
    $stmt->execute([$_POST['title'], $_POST['content'], $id]);
    header('Location: posts.php');
    exit;
}
?>


<h2>Редактирование статьи</h2>
<form method="POST">
    <input type="text" name="title" value="<?= htmlspecialchars($post['title']) ?>" required>
    <textarea name="content" required><?= htmlspecialchars($post['content']) ?></textarea>
    <button type="submit">Обновить</button>
</form>

5.4. Удаление записи

Файл admin/delete.php:

<?php
require '../includes/auth.php';
require '../includes/db.php';


$id = $_GET['id'];
$stmt = $pdo->prepare("DELETE FROM posts WHERE id = ?");
$stmt->execute([$id]);
header('Location: posts.php');
exit;

6. Защита админки

Даже простая админка на локальном сервере может стать уязвимой. Не стоит пренебрегать базовыми мерами безопасности — они легко реализуются и значительно снижают риски.

 Защита входа в систему
Защита входа в систему

6.1. Контроль доступа

Каждая страница внутри админки должна быть недоступна без авторизации. В начале каждого скрипта подключайте auth.php, проверяющий, вошел ли пользователь в систему. Даже при знании точного URL, пользователь без входа не получит содержимое страницы.

6.2. Безопасные запросы к базе

Используйте только подготовленные SQL-запросы (prepare и execute). Это помогает избежать внедрения вредоносного кода через формы или параметры URL — угрозы, известной как SQL-инъекция.

6.3. Шифрование паролей

Никогда не сохраняйте пароли в базе в исходном виде. Вместо этого всегда применяйте password_hash(). При авторизации задействуйте password_verify() для проверки соответствия. Эти методы интегрированы в PHP и соответствуют современным требованиям безопасности.

6.4. Защита от подмены запросов

Чтобы исключить возможность выполнения действий от имени пользователя без его ведома, добавляйте в формы специальные токены. Их можно сохранять в сессии и передавать в скрытом поле формы. При получении запроса сравнивайте токен из формы с сохраненным в сессии. Если они не совпадают — прекращайте выполнение.

6.5. Защита от внедрения скриптов (XSS)

Выводя данные на страницу, особенно введенные пользователем, обязательно экранируйте их с помощью htmlspecialchars(). Это предотвратит выполнение вредоносных скриптов в браузере и обезопасит как вас, так и ваших пользователей. Рекомендуется применять такую обработку ко всем полям от заголовков до содержимого.

Мы собрали подборку курсов для людей с разным уровнем подготовки

Хотите стать программистом?

Мы собрали подборку курсов для людей с разным уровнем подготовкиПерейти

7. Стилизация и улучшение интерфейса

Даже самая функциональная админка выглядит устаревшей без базовой стилизации.

7.1. Подключение Bootstrap

Загрузите Bootstrap с CDN и подключите его в includes/header.php:

<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">

Теперь формы и таблицы будут выглядеть аккуратно без лишних усилий.

7.2. Улучшение таблиц и форм

Добавьте классы Bootstrap к таблицам (table, table-striped) и формам (form-control, btn, btn-primary). Это сразу повысит читаемость и восприятие интерфейса.

7.3. Уведомления и подтверждения

Вы можете использовать JavaScript для отображения всплывающих уведомлений после действий (например, «Запись успешно обновлена») или подтверждений при удалении.

7.4. Интерактивность

Для поиска и фильтрации можно добавить небольшие JS-скрипты или подключить jQuery и плагины вроде DataTables, если хочется больше динамики.

8. Дополнительные функции

Когда основа готова, начинайте развивать админку:

8.1. Загрузка изображений

Реализуйте форму с полем типа file и обрабатывайте загрузку через move_uploaded_file. Не забывайте проверять MIME-тип и расширение файлов.

8.2. Поиск по статьям

Добавьте поле поиска, которое отправляет GET-запрос и фильтрует статьи по title.

8.3. Роли пользователей

Добавьте возможность создавать редакторов, которым доступна только часть функций. Например, в auth.php проверяйте, если $_SESSION['user']['role'] !== 'admin', скрывайте управление пользователями или удаление записей.

8.4. Журнал действий

В отдельной таблице (logs) сохраняйте, кто и что сделал: добавление, удаление, вход. Это поможет отслеживать изменения и в будущем — раздавать доступ безопаснее.

Хотите разобраться в тонкостях веб-разработки? Запишитесь на курс Академии ТОП. Никакой лишней теории — наши студенты учатся писать код с первого занятия. В процессе обучения мы разбираем реальные кейсы и гарантируем готовое портфолио еще до конца учебы.

Частые вопросы

1. Подойдет ли эта админка для размещения на рабочем сайте?

С доработкой — да. Чтобы использовать панель в реальном проекте, нужно обратить особое внимание на защиту: подключить HTTPS, реализовать защиту от XSS и CSRF-атак, а также внедрить более гибкую систему прав доступа с разграничением ролей. Без этих доработок запуск в продакшн может быть рискован.

2. Чем отличается админка на чистом PHP от использования фреймворка (например, Laravel)?

Чистый PHP подходит для обучения и небольших проектов. Фреймворки обеспечивают более высокую безопасность, читаемость кода и масштабируемость, но требуют больше знаний.

3. Как добавить права доступа (например, редактор, админ)?

Добавьте в таблицу пользователей поле role и проверяйте его значение при выводе разделов админки. Например, редактору можно разрешить только редактирование, а админу — полные права.

4. Что делать, если админка стала недоступной или вылетает ошибка?

Проверьте лог ошибок сервера (например, error_log), убедитесь в корректности подключения к базе данных и наличии нужных файлов. Также можно временно включить отображение ошибок через ini_set('display_errors', 1);.

Хотите лучше разобраться в вопросе?

Приходите на бесплатное занятие в вашем городе и получите ответы от практикующих экспертов

Нажимая на кнопку, я соглашаюсь на обработку персональных данных