Веб-приложение — интерактивный словарь-справочник химических терминов для студентов, школьников и преподавателей. Пользователь может искать определения по названию, категории и алфавиту, сохранять полезные термины в личное избранное и просматривать карточку термина с определением и примером. Администратор управляет содержимым словаря (термины, категории) и видит список пользователей.
Цель — обеспечить удобный поиск и систематизацию учебного материала по химии в одном месте, а также показать реализацию полного цикла учебного веб-проекта на PHP: аутентификация, роли, CRUD, AJAX-поиск, защита от XSS/SQL-инъекций/CSRF.
- PHP 8.0 или новее (используется
match, типы аргументов,str_starts_with) - MySQL 5.7+ / MariaDB 10+
- Веб-сервер (Apache, Nginx или встроенный
php -S) - Расширение PHP
pdo_mysql
-
Скопировать проект в каталог веб-сервера (например,
/var/www/chem-dictionary.local) или открыть текущую папку. -
Создать БД и наполнить тестовыми данными:
mysql -u root -p < sql/database.sqlСкрипт создаёт базу
chem_dictionary, четыре таблицы (categories,users,terms,favorites) и заполняет их сидовыми записями (5 категорий, 20 терминов, 3 пользователя, 5 избранных). -
Настроить подключение к БД в файле
includes/db.php:$host = '127.0.0.1'; // адрес MySQL-сервера $dbname = 'chem_dictionary'; $username = 'root'; $password = '';
Параметры приведены под локальную разработку. Для прод-окружения замените хост, логин и пароль.
-
Запустить сервер одним из способов:
- Встроенный сервер PHP из корня проекта:
Открыть в браузере: http://localhost:8000.
php -S localhost:8000
- Либо настроить виртуальный хост Apache/Nginx на корневую папку проекта.
- Встроенный сервер PHP из корня проекта:
-
Войти под одним из тестовых пользователей (см. ниже).
Все пароли — 123456 (хэш одинаковый для всех записей в sql/database.sql).
| Логин | Пароль | Роль | |
|---|---|---|---|
admin |
admin@chem.ru | 123456 | Администратор |
student1 |
student1@mail.ru | 123456 | Пользователь |
stud2 |
stud2@mail.ru | 123456 | Пользователь |
Войти можно как по имени пользователя, так и по email.
- Просмотр главной страницы со статистикой словаря.
- Регистрация нового аккаунта.
- Вход по логину или email.
- Просмотр списка терминов с фильтрами.
- Открытие карточки термина.
- Добавление и удаление терминов из личного избранного.
- Просмотр своего списка избранного с пагинацией.
- Выход из аккаунта.
- Полнотекстовый поиск по названию, определению и примеру.
- Фильтр по категории.
- Алфавитный указатель (буквы без терминов — неактивны).
- Сортировка: по алфавиту или по категории.
- Пагинация по 20 записей на страницу.
- AJAX-обновление результатов без перезагрузки страницы (
api/search.php+js/terms-search.js).
- Управление терминами: создание, редактирование, удаление.
- Управление категориями: создание, редактирование, удаление.
- Список пользователей с поиском по логину/email и фильтром по роли.
- Подсчёт количества избранного у каждого пользователя.
- Хэширование паролей через
password_hash/password_verify. - Защита от SQL-инъекций — все запросы через prepared statements PDO.
- Защита от XSS — экранирование вывода функцией
e()(обёртка надhtmlspecialchars). - CSRF-токены на действиях изменения данных (добавление/удаление избранного, удаление термина).
- Разграничение доступа по ролям (
requireLogin,requireAdmin). - Защита от open redirect при возврате после действия с избранным.
- PHP 8 — серверная логика.
- PDO — работа с MySQL, prepared statements.
- MySQL / MariaDB — хранение данных (InnoDB, utf8mb4).
- Сессии PHP — аутентификация и CSRF-токены.
- Bootstrap 5 — вёрстка, компоненты, сетка.
- Vanilla JavaScript — AJAX-поиск без зависимостей (
js/terms-search.js). - HTML5 / CSS3 — собственные стили в
css/style.css.
chem-dictionary.local/
├── admin/ # Админ-панель (CRUD категорий, терминов, список пользователей)
├── api/ # REST-эндпоинт для AJAX-поиска
├── css/ # Стили
├── includes/ # db.php, functions.php, header.php, footer.php
├── js/ # Клиентские скрипты
├── sql/ # Схема БД и сидовые данные
├── index.php # Главная
├── login.php # Вход
├── register.php # Регистрация
├── logout.php # Выход
├── terms.php # Список терминов
├── term.php # Карточка термина
├── favorites.php # Личное избранное
└── favorite_toggle.php # Обработчик добавления/удаления из избранного