Найти в Дзене
Уха из Питуха

Работа с MySQL в PHP: руководство для разработки

⁴ MySQL — реляционная СУБД, которая в связке с PHP позволяет создавать динамические веб-приложения. Для работы используется расширение mysqli, предлагающее: // Объектно-ориентированный стиль $mysqli = new mysqli("localhost", "user", "password", "database"); if ($mysqli->connect_error) { die("Ошибка подключения: " . $mysqli->connect_error); } $mysqli->set_charset("utf8mb4"); Процедурный подход: $conn = mysqli_connect("localhost", "user", "pass", "db"); if (mysqli_connect_errno()) { echo "Ошибка: " . mysqli_connect_error(); exit(); } mysqli_set_charset($conn, "utf8mb4"); Важные моменты: Пример защиты от SQL-инъекций: $stmt = $mysqli->prepare("INSERT INTO users (name, email) VALUES (?, ?)"); $stmt->bind_param("ss", $name, $email); $name = "Иван"; $email = "ivan@example.com"; $stmt->execute(); $new_id = $stmt->insert_id; // Получаем ID новой записи 1. Создание (Create): $sql = "INSERT INTO posts (title, content) VALUES (?, ?)"; $stmt = $mysqli->prepare($sql); $stmt->bind_p
Оглавление

🔌 Основы взаимодействия PHP и MySQL

MySQL — реляционная СУБД, которая в связке с PHP позволяет создавать динамические веб-приложения. Для работы используется расширение mysqli, предлагающее:

  • Поддержку подготовленных запросов (защита от SQL-инъекций)
  • Два стиля работы: процедурный и объектно-ориентированный
  • Расширенный функционал для транзакций

// Объектно-ориентированный стиль

$mysqli = new mysqli("localhost", "user", "password", "database");

if ($mysqli->connect_error) {

die("Ошибка подключения: " . $mysqli->connect_error);

}

$mysqli->set_charset("utf8mb4");

🛠️ Подключение к базе данных

Процедурный подход:

$conn = mysqli_connect("localhost", "user", "pass", "db");

if (mysqli_connect_errno()) {

echo "Ошибка: " . mysqli_connect_error();

exit();

}

mysqli_set_charset($conn, "utf8mb4");

Важные моменты:

  • Всегда проверяйте соединение
  • Устанавливайте кодировку сразу после подключения
  • Используйте константы вместо хардкода параметров

🛡️ Безопасность: подготовленные запросы

Пример защиты от SQL-инъекций:

$stmt = $mysqli->prepare("INSERT INTO users (name, email) VALUES (?, ?)");

$stmt->bind_param("ss", $name, $email);

$name = "Иван";

$email = "ivan@example.com";

$stmt->execute();

$new_id = $stmt->insert_id; // Получаем ID новой записи

📊 CRUD-операции: основные примеры

1. Создание (Create):

$sql = "INSERT INTO posts (title, content) VALUES (?, ?)";

$stmt = $mysqli->prepare($sql);

$stmt->bind_param("ss", $_POST['title'], $_POST['content']);

$stmt->execute();

2. Чтение (Read):

$result = $mysqli->query("SELECT * FROM products WHERE price > 50");

while ($row = $result->fetch_assoc()) {

echo $row['name'] . ": " . $row['price'] . " руб.<br>";

}

3. Обновление (Update):

$stmt = $mysqli->prepare("UPDATE users SET last_login = NOW() WHERE id = ?");

$stmt->bind_param("i", $user_id);

$stmt->execute();

4. Удаление (Delete):

$mysqli->begin_transaction();

try {

$mysqli->query("DELETE FROM logs WHERE created_at < '2023-01-01'");

$mysqli->commit();

} catch (Exception $e) {

$mysqli->rollback();

}

🚀 Оптимизация производительности

  1. Индексы: Добавляйте на часто используемые поля
  2. Выборка данных:
  • Используйте SELECT конкретные_поля вместо SELECT *
  • Ограничивайте выборку LIMIT
  1. Кэширование: Используйте mysqli_stmt::store_result()
  2. Транзакции: Для групповых операций

🔄 Работа с транзакциями

$mysqli->autocommit(FALSE);

try {

$mysqli->query("UPDATE account SET balance = balance - 100 WHERE user_id = 1");

$mysqli->query("UPDATE account SET balance = balance + 100 WHERE user_id = 2");

$mysqli->commit();

} catch (Exception $e) {

$mysqli->rollback();

echo "Ошибка транзакции: " . $e->getMessage();

}

🛠️ Лучшие практики

  1. Всегда закрывайте соединения:
  2. $mysqli->close(); // или mysqli_close($conn)
  3. Используйте ORM (например, Doctrine) для сложных проектов
  4. Логируйте ошибки SQL:
  5. if (!$mysqli->query($sql)) {
  6. error_log("MySQL Error: " . $mysqli->error);
  7. }
  8. Работа с разными типами данных:
  • Даты: $mysqli->query("INSERT INTO events (date) VALUES (NOW())")
  • Бинарные данные: используйте bind_param с типом ‘b’

🧠 Продвинутые техники

Хранимые процедуры:

$stmt = $mysqli->prepare("CALL get_user_stats(?)");

$stmt->bind_param("i", $user_id);

$stmt->execute();

$result = $stmt->get_result();

Динамические запросы:

$filters = [];

$params = [];

if (!empty($_GET['category'])) {

$filters[] = "category = ?";

$params[] = $_GET['category'];

}

$sql = "SELECT * FROM products" . (!empty($filters) ? " WHERE " . implode(" AND ", $filters) : "");

🔚 Заключение

Ключевые моменты для успешной работы:

  • Всегда используйте подготовленные запросы
  • Выбирайте стиль (процедурный/ООП) согласно стандартам проекта
  • Оптимизируйте запросы с помощью EXPLAIN
  • Регулярно делайте бэкапы баз данных
  • Используйте миграции для изменений структуры БД

[📚 Дополнительные ресурсы]

  • MySQL 8.0 Reference Manual
  • Курс “Продвинутый SQL для веб-разработчиков” на GitVerse Academy

Статья актуальна для PHP 8.3 и MySQL 8.0. Все примеры проверены на актуальных версиях.