Основы баз данных MySQL и работа через PDO
Проектирование реляционных баз данных, выполнение SQL-запросов и безопасное подключение к БД через PDO.
Интернет-магазин не может существовать без хранения данных. Пользователи, товары, заказы — все это хранится в Базе Данных (БД). Мы будем использовать MySQL — самую популярную реляционную СУБД. Реляционная означает, что данные хранятся в таблицах, связанных между собой. Например, в таблице orders (заказы) есть колонка user_id, которая ссылается на конкретного пользователя в таблице users. Для общения PHP с MySQL мы используем PDO (PHP Data Objects). PDO — это универсальный интерфейс для доступа к базам данных. В отличие от устаревших функций mysqli_*, PDO поддерживает множество различных СУБД и, самое главное, обеспечивает высочайший уровень безопасности благодаря использованию Подготовленных запросов (Prepared Statements).
<?php
// DSN (Data Source Name) указывает тип БД, хост, имя базы и кодировку
$dsn = 'mysql:host=localhost;dbname=shop;charset=utf8mb4';
$user = 'root';
$password = 'password';
try {
// Создание подключения PDO
$pdo = new PDO($dsn, $user, $password, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]);
echo "Подключение к БД успешно!";
} catch (PDOException $e) {
die("Ошибка подключения: " . $e->getMessage());
}
?>
Самая страшная угроза для вашего магазина — это SQL-инъекция (SQL Injection). Это атака, при которой хакер вводит вредоносный SQL-код в поле поиска или формы авторизации. Если вы вставляете переменные напрямую в SQL-запрос (например, SELECT * FROM users WHERE email = '$email'), хакер может написать вместо email строку ' OR 1=1 --, и база данных вернет ему все записи, включая пароли администраторов! Чтобы этого избежать, PDO использует подготовленные запросы. Вы отправляете шаблон запроса с плейсхолдерами (например, :price), а затем отдельно отправляете данные. База данных сама безопасно экранирует данные, понимая, что это просто текст, а не команда к выполнению. Это золотой стандарт безопасности в веб-разработке.
<?php
// БЕЗОПАСНАЯ выборка данных из БД с использованием подготовленных запросов
$priceFilter = 100;
// 1. Подготавливаем запрос с плейсхолдером :price
$stmt = $pdo->prepare('SELECT * FROM products WHERE price > :price');
// 2. Выполняем запрос, передавая массив с реальными значениями
$stmt->execute(['price' => $priceFilter]);
// 3. Получаем все строки в виде ассоциативного массива
$products = $stmt->fetchAll();
foreach ($products as $product) {
echo $product['name'] . " - $" . $product['price'] . "<br>";
}
?>
Задание
Сценарий: Пользователь ищет товар по названию в поисковой строке.
- Получить строку поиска от пользователя (например, $search = 'Laptop').
- Подготовить SQL запрос: SELECT * FROM products WHERE name LIKE :name
- Вызвать метод execute(), передав массив ['name' => '%' . $search . '%']
- Вызвать метод fetchAll() для получения результатов.