Уроки курса
1 Основы синтаксиса PHP 8
60 мин
2 Функции и управляющие конструкции
60 мин
3 Объектно-ориентированное программирование на PHP
60 мин
4 Наследование, интерфейсы и полиморфизм
60 мин
5 Основы баз данных MySQL и работа через PDO
60 мин
6 Архитектурный паттерн MVC
60 мин
7 Введение в Laravel и настройка окружения
60 мин
8 Маршрутизация и контроллеры в Laravel
60 мин
9 Шаблонизатор Blade и создание интерфейса
60 мин
10 Миграции баз данных и Eloquent ORM
60 мин
11 Связи моделей в Eloquent — Настройка связей 'один …
60 мин
12 Аутентификация и защита маршрутов
60 мин
13 Разработка каталога товаров и категорий
60 мин
14 Реализация корзины покупок через сессии
60 мин
15 Оформление заказа и транзакции базы данных
60 мин
16 Интеграция платежной системы Stripe
60 мин
17 Интеграция платежной системы Vipps
60 мин
18 Разработка панели администратора
60 мин
19 Оптимизация и подготовка к production
60 мин
20 Деплой Laravel-приложения на сервер
60 мин
21 Основы PHP 8: Синтаксис, переменные и управляющие конструкции
60 мин
22 Функции и массивы в PHP 8
60 мин
23 Объектно-ориентированное программирование: Классы и объекты
60 мин
24 Продвинутое ООП: Наследование, интерфейсы и полиморфизм
60 мин
25 Основы баз данных: Проектирование БД и работа с …
60 мин
26 Взаимодействие PHP с MySQL через PDO
60 мин
27 Архитектура MVC и введение в фреймворк Laravel
60 мин
28 Маршрутизация и контроллеры в Laravel
60 мин
29 Шаблонизатор Blade: Создание пользовательского интерфейса
60 мин
30 Миграции и Eloquent ORM: Создание таблиц товаров
60 мин
31 Связи в Eloquent ORM: Отношения между моделями
60 мин
32 Аутентификация и авторизация пользователей
60 мин
33 Разработка каталога товаров: Вывод, фильтрация и пагинация
60 мин
34 Реализация корзины покупок с использованием сессий
60 мин
35 Оформление заказа: Работа с формами и валидация
60 мин
36 Транзакции базы данных: Сохранение заказа
60 мин
37 Интеграция платежной системы Stripe
60 мин
38 Интеграция платежной системы Vipps
60 мин
39 Создание панели администратора
60 мин
40 Подготовка к production и деплой приложения
60 мин
41 Основы PHP 8 и синтаксис
60 мин
42 Объектно-ориентированное программирование на PHP
60 мин
43 Продвинутое ООП и интерфейсы
60 мин
44 Основы баз данных и MySQL
60 мин
45 Архитектурный паттерн MVC
60 мин
46 Введение в Laravel и маршрутизация
60 мин
47 Шаблонизатор Blade и верстка интерфейса
60 мин
48 Миграции и структура базы данных
60 мин
49 Eloquent ORM и модели
60 мин
50 Отношения в Eloquent ORM
60 мин
51 Авторизация и защита маршрутов
60 мин
52 Создание каталога товаров
60 мин
53 Реализация корзины покупок
60 мин
54 Оформление заказа и транзакции БД
60 мин
55 Интеграция платежной системы Stripe
60 мин
56 Интеграция платежной системы Vipps
60 мин
57 Панель администратора: управление товарами
60 мин
58 Панель администратора: управление заказами
60 мин
59 Подготовка к production и деплой
60 мин
60 Запуск и тестирование готового интернет-магазина
60 мин

Основы баз данных: Проектирование БД и работа с MySQL

Студент познакомится с реляционными базами данных, спроектирует структуру таблиц для интернет-магазина и напишет базовые SQL-запросы.

Прогресс урока: 0%

Реляционные базы данных и нормализация

Любой интернет-магазин должен где-то хранить данные пользователей, товаров и заказов. Для этого используются Системы Управления Базами Данных (СУБД). Мы будем использовать MySQL — самую популярную реляционную СУБД в экосистеме PHP. "Реляционная" означает, что данные хранятся в таблицах (состоящих из строк и столбцов), которые связаны между собой отношениями (relations). Проектирование структуры БД — критически важный этап. Ошибка здесь приведет к огромным проблемам при масштабировании.

В архивных материалах описана миграция для таблицы products. Каждая таблица должна иметь Первичный ключ (Primary Key) — обычно это колонка id, уникально идентифицирующая запись. Для связи таблиц используются Внешние ключи (Foreign Keys). Например, в таблице товаров есть category_id, который ссылается на id в таблице категорий. Это связь "Один ко многим" (одна категория содержит много товаров). Нормализация баз данных — это процесс организации таблиц для минимизации избыточности (дублирования) данных. Вместо того чтобы в каждом товаре писать название категории текстом, мы храним только числовой ID категории.

Имя колонки Тип данных MySQL Описание
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY Уникальный идентификатор
category_id BIGINT UNSIGNED FOREIGN KEY Связь с таблицей категорий
name VARCHAR(255) Название товара
price DECIMAL(8, 2) Цена (8 цифр всего, 2 после запятой)

Подключение к MySQL через PDO и защита от SQL-инъекций

Для работы с базами данных в PHP используется расширение PDO (PHP Data Objects). PDO предоставляет единый интерфейс для доступа к различным базам данных и поддерживает подготовленные выражения (Prepared Statements). Подготовленные выражения — это абсолютный стандарт безопасности веб-разработки. Они полностью защищают приложение от SQL-инъекций — самого распространенного типа атак, при котором злоумышленник пытается внедрить вредоносный SQL-код через поля ввода.

В архивном упражнении 2.1 показан правильный подход. Мы сначала создаем объект подключения $pdo, передавая DSN (Data Source Name), логин и пароль. Затем мы не вставляем переменные напрямую в SQL-строку (НИКОГДА не делайте "SELECT * FROM products WHERE price > $price"). Вместо этого мы пишем запрос с плейсхолдером :price, подготавливаем его методом prepare(), и только потом выполняем execute(), передавая массив со значениями. База данных сама безопасно подставит значения. Результат мы получаем методом fetchAll(). Мы настраиваем PDO на режим FETCH_ASSOC, чтобы получить данные в виде удобного ассоциативного массива.

php
<?php
// Архивные материалы: Подключение и выборка через PDO
$dsn = 'mysql:host=localhost;dbname=shop;charset=utf8mb4';
$user = 'root';
$password = 'secret';

try {
    $pdo = new PDO($dsn, $user, $password, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    ]);

    // Использование подготовленных выражений для безопасности
    $stmt = $pdo->prepare('SELECT * FROM products WHERE price > :price');
    $stmt->execute(['price' => 100]);
    
    $products = $stmt->fetchAll();
    
    foreach ($products as $product) {
        echo $product['name'] . " - $" . $product['price'] . "\n";
    }
} catch (PDOException $e) {
    die("Ошибка подключения: " . $e->getMessage());
}

Почему необходимо использовать подготовленные выражения (Prepared Statements) в PDO?

Какой тип данных MySQL лучше всего использовать для хранения точных денежных сумм (цены товара), чтобы избежать ошибок округления?

Задание

Практика: Вставка данных (INSERT)

  • Напишите SQL-запрос INSERT для таблицы orders (user_id, total_price).
  • Используйте именованные плейсхолдеры :user_id и :total_price.
  • Используйте метод $pdo->prepare().
  • Вызовите execute(), передав массив со значениями (например, user_id => 1, total_price => 250.00).
10 баллов