Уроки курса
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-запросов и безопасное подключение к базе данных через PDO.

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

Проектирование БД и PDO: Безопасность прежде всего

Любой интернет-магазин нуждается в надежном хранилище данных. В нашем курсе мы используем реляционную СУБД MySQL. Проектирование базы данных начинается с нормализации — процесса устранения избыточности данных. Основные таблицы нашего проекта: users, categories, products, orders и order_items.

Для связи PHP и MySQL мы будем использовать PDO (PHP Data Objects). PDO — это универсальный интерфейс для доступа к различным базам данных. Главная причина использования PDO — безопасность. В веб-разработке существует критическая уязвимость, называемая SQL-инъекцией. Она возникает, когда пользовательский ввод напрямую вставляется в SQL-строку. Злоумышленник может ввести в поле поиска '; DROP TABLE users; --, и если код не защищен, база данных будет удалена.

PDO решает эту проблему с помощью Подготавливаемых запросов (Prepared Statements). Вместо подстановки переменных в строку, мы используем плейсхолдеры (например, :price). PDO отправляет сам SQL-запрос и данные отдельно. База данных компилирует запрос, а затем подставляет данные как безопасные значения, что делает SQL-инъекцию невозможной. Мы применим метод Direct Instruction для пошагового разбора подключения.

php
<?php
// Практика: Подключение и выборка через PDO (Архивный вариант 1, Упражнение 2.1)

// 1. DSN (Data Source Name) - строка с информацией о подключении
$dsn = 'mysql:host=localhost;dbname=shop;charset=utf8mb4';
$user = 'root';
$password = 'secret_password'; // В реальном проекте берется из .env

try {
    // 2. Инициализация объекта PDO с настройками
    $pdo = new PDO($dsn, $user, $password, [
        // Выбрасывать исключения при ошибках SQL (критично для отладки)
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        // Возвращать результаты как ассоциативный массив (ключ - имя колонки)
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        // Отключаем эмуляцию подготовленных запросов для максимальной безопасности
        PDO::ATTR_EMULATE_PREPARES => false
    ]);

    // 3. Подготавливаемый запрос (Prepared Statement) с плейсхолдером :price
    $stmt = $pdo->prepare('SELECT id, name, price FROM products WHERE price > :price');
    
    // 4. Выполнение запроса с передачей параметров
    $stmt->execute(['price' => 100]);
    
    // 5. Получение всех строк в виде массива
    $products = $stmt->fetchAll();

    foreach ($products as $product) {
        echo $product['name'] . ' - $' . $product['price'] . "<br>";
    }

} catch (PDOException $e) {
    // В production мы бы логировали ошибку, а пользователю показывали "Что-то пошло не так"
    die("Ошибка подключения к БД: " . $e->getMessage());
}
?>

Разбор структуры таблиц (Миграции в перспективе)

В приведенном выше примере мы обращаемся к таблице products. Как она должна выглядеть в MySQL? Согласно архивным материалам (Вариант 2, Упражнение 1.1), таблица товаров должна иметь строгую структуру с внешними ключами для связи с категориями. Хотя в будущем мы будем создавать таблицы с помощью миграций Laravel, важно понимать чистый SQL, который генерируется под капотом.

Пример DDL (Data Definition Language) запроса для создания таблицы товаров:

  • id BIGINT AUTO_INCREMENT PRIMARY KEY — уникальный идентификатор.
  • category_id BIGINT — внешний ключ (Foreign Key), связывающий товар с таблицей categories. Это обеспечивает ссылочную целостность данных: вы не сможете удалить категорию, если к ней привязаны товары (или они удалятся каскадно).
  • name VARCHAR(255) NOT NULL — название товара.
  • price DECIMAL(8, 2) NOT NULL — цена. Использование типа DECIMAL критически важно для денег. Использование FLOAT может привести к ошибкам округления (например, 0.1 + 0.2 = 0.30000000000000004), что недопустимо в e-commerce.

Почему для работы с деньгами в базах данных (например, цена товара) необходимо использовать тип DECIMAL, а не FLOAT?