Уроки курса
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 мин

Взаимодействие PHP с MySQL через PDO

Студент освоит безопасное подключение к базе данных с помощью PDO, научится выполнять CRUD-операции и защищаться от SQL-инъекций.

Прогресс урока: 0%
Введение в работу с базами данных в PHP. На предыдущих уроках мы изучили основы языка PHP 8 и принципы объектно-ориентированного программирования. Теперь пришло время сделать наше приложение динамическим. Интернет-магазин не может существовать без базы данных: именно там хранятся товары, пользователи, заказы и настройки. В экосистеме PHP стандартом де-факто для работы с базами данных является расширение PDO (PHP Data Objects). PDO предоставляет абстрактный уровень доступа к данным, что означает единый интерфейс (набор методов) для работы с различными СУБД, будь то MySQL, PostgreSQL или SQLite. Главное преимущество PDO заключается в его безопасности и объектно-ориентированной архитектуре. В прошлом разработчики часто использовали процедурные функции вроде mysqli_query, что нередко приводило к уязвимостям. Метод прямого обучения (Direct Instruction) требует от нас четкого понимания: никогда не доверяйте пользовательскому вводу. PDO решает проблему SQL-инъекций через механизм подготовленных выражений (Prepared Statements), который мы детально разберем. Для начала работы нам необходимо сформировать DSN (Data Source Name) — строку, содержащую информацию для подключения к базе данных.
php
$dsn = 'mysql:host=localhost;dbname=shop;charset=utf8mb4';
$pdo = new PDO($dsn, 'root', 'password', [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]);
Разбор подключения и обработки ошибок. Давайте детально проанализируем код выше. Переменная $dsn содержит драйвер (mysql), хост, имя базы данных и кодировку. Использование кодировки utf8mb4 критически важно для корректного сохранения любых символов, включая эмодзи, что часто встречается в отзывах товаров. При создании объекта PDO мы передаем DSN, имя пользователя и пароль. Четвертый аргумент — это массив опций. Здесь мы применяем принцип Scaffolding (постепенное усложнение), сразу задавая правильные настройки для production-среды. PDO::ATTR_ERRMODE со значением PDO::ERRMODE_EXCEPTION заставляет PDO выбрасывать исключения (Exceptions) при любых ошибках SQL. Это позволяет перехватывать их с помощью блоков try-catch и избегать вывода чувствительной информации пользователю. PDO::ATTR_DEFAULT_FETCH_MODE со значением PDO::FETCH_ASSOC указывает, что по умолчанию данные из базы будут возвращаться в виде ассоциативных массивов, где ключами являются названия столбцов таблицы. Это наиболее удобный формат для последующей передачи данных в шаблоны или преобразования в JSON. Если не задать этот параметр, PDO вернет массив, содержащий данные как по ассоциативным ключам, так и по числовым индексам, что удвоит потребление памяти.
Подготовленные выражения и защита от SQL-инъекций. SQL-инъекция — это атака, при которой злоумышленник внедряет вредоносный SQL-код через формы ввода. Представьте запрос: 'SELECT * FROM users WHERE email = ' . $email. Если $email равно 'admin@mail.com' OR '1'='1', запрос вернет данные всех пользователей. PDO решает это с помощью методов prepare() и execute(). При использовании prepare() база данных сначала компилирует структуру запроса, а лишь затем, при вызове execute(), подставляет данные. Данные отправляются отдельно от самого запроса, что делает невозможным изменение логики SQL-команды. Вместо реальных значений в строке запроса мы используем именованные плейсхолдеры, например :price. Это краеугольный камень безопасности любого веб-приложения. В контексте архитектуры интернет-магазина, когда мы фильтруем каталог товаров по цене, категории или поисковому запросу, все эти данные поступают от клиента (через GET-параметры) и должны проходить через подготовленные выражения.
php
$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'] . '<br>';
}

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

Какой механизм в PDO является основным для защиты от SQL-инъекций при передаче пользовательских данных в запрос?

Задание

Сценарий: Вам необходимо реализовать функцию добавления нового товара в базу данных из административной панели. Разработайте алгоритм действий с использованием PDO.

  • Создать объект подключения PDO с обработкой исключений.
  • Подготовить SQL-запрос INSERT INTO products с именованными плейсхолдерами (:name, :price).
  • Вызвать метод execute(), передав ассоциативный массив с данными из формы.
  • Проверить успешность выполнения и получить ID добавленной записи через lastInsertId().
10 баллов