Если вы делаете сайт на PHP, рано или поздно данные придётся хранить. Логины, статьи, комментарии — всё это удобно складывать в базу. MySQL — самый популярный выбор. В этой статье разберём, как подключиться к базе, выполнять запросы и не наступить на грабли.

Digital-студия WNDER

Почему MySQL и PHP — классическая связка

PHP и MySQL дружат давно. Оба бесплатные, простые в установке и работают почти на любом хостинге. Если вы только начинаете, эта пара — отличный старт. PHP умеет общаться с базой через расширения. Раньше все использовали mysql, потом mysqli, а сейчас стандарт — PDO.

PDO — это универсальный интерфейс. Он работает не только с MySQL, но и с PostgreSQL, SQLite и другими. Если завтра вы решите сменить базу, код переписывать почти не придётся. Поэтому советую сразу привыкать к PDO.

Подключение к базе: первые шаги

Для начала нужны данные: хост (обычно localhost), имя базы, логин и пароль. В PHP создаём объект PDO и передаём эти данные. Вот как это выглядит:


<?php
$host = 'localhost';
$db   = 'test_db';
$user = 'root';
$pass = '';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];

try {
    $pdo = new PDO($dsn, $user, $pass, $options);
    echo "Подключение успешно";
} catch (PDOException $e) {
    echo "Ошибка: " . $e->getMessage();
}
?>

Обратите внимание на опции. ERRMODE_EXCEPTION заставляет PDO выбрасывать исключения при ошибках — так вы их не пропустите. DEFAULT_FETCH_MODE = FETCH_ASSOC возвращает данные в виде ассоциативного массива, а EMULATE_PREPARES = false отключает эмуляцию подготовленных запросов — это важно для безопасности.

Правило: Никогда не храните пароли и логины в коде. Используйте переменные окружения или конфигурационные файлы вне корня сайта.

Основные операции: CRUD на практике

CRUD — это создание, чтение, обновление и удаление. Разберём каждый на примерах. Все запросы выполняем через подготовленные выражения (prepared statements). Это защита от SQL-инъекций.

Создание (INSERT)


<?php
$sql = "INSERT INTO users (name, email) VALUES (:name, :email)";
$stmt = $pdo->prepare($sql);
$stmt->execute(['name' => 'Иван', 'email' => 'ivan@example.com']);
echo "Пользователь добавлен";
?>

Чтение (SELECT)


<?php
$stmt = $pdo->query("SELECT * FROM users");
$users = $stmt->fetchAll();
foreach ($users as $user) {
    echo $user['name'] . ' — ' . $user['email'] . '<br>';
}
?>

Обновление (UPDATE)


<?php
$sql = "UPDATE users SET email = :email WHERE id = :id";
$stmt = $pdo->prepare($sql);
$stmt->execute(['email' => 'new@example.com', 'id' => 1]);
?>

Удаление (DELETE)


<?php
$sql = "DELETE FROM users WHERE id = :id";
$stmt = $pdo->prepare($sql);
$stmt->execute(['id' => 1]);
?>

Как видите, всё просто. Главное — не забывать про подготовленные выражения. Они автоматически экранируют опасные символы.

Безопасность превыше всего

SQL-инъекции — главная головная боль при работе с базами. Хакер может ввести в форму что-то вроде ' OR '1'='1, и если вы вставляете данные напрямую в запрос, он получит доступ ко всей таблице. Подготовленные выражения решают эту проблему.

Вот как делать нельзя:


<?php
// Плохо! Уязвимо для инъекций
$name = $_POST['name'];
$pdo->query("SELECT * FROM users WHERE name = '$name'");
?>

А вот как нужно:


<?php
// Хорошо! Используем подготовленный запрос
$stmt = $pdo->prepare("SELECT * FROM users WHERE name = :name");
$stmt->execute(['name' => $_POST['name']]);
?>

Разница огромна. Всегда используйте плейсхолдеры (например, :name) и передавайте значения отдельно.

Лайфхак: Включите логирование ошибок PDO в файл, но не выводите их пользователю. Это поможет отлаживать, но не раскроет структуру базы.

Полезные функции и параметры PDO

PDO предоставляет много возможностей. Вот основные методы и опции, которые стоит знать:

Метод / Опция Что делает
prepare()Создаёт подготовленный запрос
execute()Выполняет запрос с параметрами
query()Выполняет простой запрос без параметров
fetch()Возвращает одну строку результата
fetchAll()Возвращает все строки в виде массива
lastInsertId()ID последней вставленной записи
rowCount()Количество затронутых строк
PDO::ATTR_ERRMODEРежим обработки ошибок (исключения, предупреждения, тишина)
PDO::ATTR_DEFAULT_FETCH_MODEФормат возвращаемых данных (ассоциативный, объект, число)

Эти методы покрывают 90% задач. Освоив их, вы сможете строить полноценные приложения.

Заключение

Работа с MySQL через PDO — это просто, безопасно и удобно. Главное — использовать подготовленные выражения, не хранить пароли в коде и внимательно читать ошибки. Начните с малого: подключитесь к базе, сделайте пару запросов. Дальше пойдёт как по маслу.

Помните: база данных — это сердце вашего приложения. Относитесь к ней бережно, и она ответит вам надёжностью.

Студия WNDER