Статья

Подключение базы данных в PHP: что важно знать 💾

Без базы данных сайт — просто набор статических страниц. Никаких пользователей, постов, заказов или комментариев. Всё живое и динамичное на сайте работает именно благодаря БД.

Но как правильно подключить базу данных в PHP? Какие ошибки чаще всего делают новички? И как сделать, чтобы всё было и быстро, и безопасно?

Разбираем всё по шагам.


1. Что вообще такое база данных

База данных (БД) — это место, где хранятся все данные сайта. Например:

  • пользователи — логин, пароль, email;

  • статьи — заголовок, текст, дата публикации;

  • заказы — товары, суммы, статусы.

PHP подключается к БД, чтобы:

  • записывать данные (например, регистрацию нового пользователя);

  • читать (показать статьи или товары);

  • обновлять и удалять (редактировать профиль, удалить пост).

Самые популярные БД для PHP — MySQL, MariaDB и PostgreSQL.


2. Старый способ — mysqli_connect()

Раньше всё делали через простую функцию:

$conn = mysqli_connect('localhost', 'user', 'password', 'database');

if (!$conn) {
    die("Ошибка подключения: " . mysqli_connect_error());
}

Такой способ до сих пор работает, но считается устаревшим. Лучше использовать PDO — современный и безопасный способ.


3. Современный вариант — PDO

PDO (PHP Data Objects) — универсальный интерфейс для работы с разными БД.

Можно подключить не только MySQL, но и SQLite, PostgreSQL, MSSQL — достаточно поменять строку подключения.

Пример:

try {
    $pdo = new PDO("mysql:host=localhost;dbname=mydb;charset=utf8", "user", "password");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Подключение успешно!";
} catch (PDOException $e) {
    echo "Ошибка подключения: " . $e->getMessage();
}

Плюсы PDO:

  • поддерживает подготовленные запросы (safe SQL);

  • можно менять тип базы без переписывания кода;

  • легко ловить ошибки.


4. Где хранить данные для подключения

Никогда не пиши логин и пароль прямо в коде, особенно если выкладываешь проект на GitHub.

Лучше хранить настройки в отдельном файле:

config.php

return [
    'host' => 'localhost',
    'db' => 'mydb',
    'user' => 'user',
    'pass' => 'password',
    'charset' => 'utf8'
];

db.php

$config = require 'config.php';
$dsn = "mysql:host={$config['host']};dbname={$config['db']};charset={$config['charset']}";
$pdo = new PDO($dsn, $config['user'], $config['pass']);

И не клади config.php в публичную папку (public_html, www). Лучше на уровень выше.


5. Проверяй соединение и ошибки

PDO по умолчанию не показывает ошибки. Чтобы их видеть:

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Теперь, если что-то пойдёт не так, PHP выбросит исключение, и ты увидишь, где ошибка.

Но в продакшне лучше не показывать пользователю полные тексты ошибок — логируй их в файл.


6. Как отправлять запросы безопасно

Многие до сих пор делают так:

$sql = "SELECT * FROM users WHERE email = '$_POST[email]'";

Это опасно — SQL-инъекция обеспечена.

Правильно — использовать prepared statements:

$stmt = $pdo->prepare("SELECT * FROM users WHERE email = ?");
$stmt->execute([$_POST['email']]);
$user = $stmt->fetch();

Так ты защищаешься от атак, при которых хакер вставляет вредный SQL-код.


7. Как вставлять данные в базу

Ещё пример — добавление пользователя:

$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->execute([$name, $email]);

Или вариант с именованными параметрами:

$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
$stmt->execute(['name' => $name, 'email' => $email]);

Это удобнее, когда параметров много.


8. Как читать данные

$stmt = $pdo->query("SELECT * FROM users");
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);

foreach ($users as $user) {
    echo $user['name'] . '<br>';
}

Формат PDO::FETCH_ASSOC возвращает массив с ключами по названию столбцов.


9. Обновление и удаление

Обновление:

$stmt = $pdo->prepare("UPDATE users SET name = ? WHERE id = ?");
$stmt->execute([$newName, $id]);

Удаление:

$stmt = $pdo->prepare("DELETE FROM users WHERE id = ?");
$stmt->execute([$id]);

Принцип один и тот же — через prepare() и execute().


10. Кодировка — всегда utf8mb4

Многие ставят просто utf8, но это урезанная версия.

utf8mb4 поддерживает эмодзи 😄 и все современные символы.

$pdo = new PDO("mysql:host=localhost;dbname=mydb;charset=utf8mb4", "user", "password");

И не забудь поставить ту же кодировку в базе данных.


11. Разрывай соединение после работы

Когда скрипт заканчивает работу, соединение закрывается автоматически.

Но если ты делаешь долгие операции — лучше закрывать вручную:

$pdo = null;

Это освободит ресурсы и не создаст лишнюю нагрузку.


12. Обработка ошибок через try-catch

При работе с базой всегда возможны ошибки: нет соединения, неверный запрос, сбой сети.

Пример:

try {
    $stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
    $stmt->execute([$id]);
} catch (PDOException $e) {
    error_log($e->getMessage());
    echo "Что-то пошло не так. Попробуй позже.";
}

Так пользователь не увидит внутренние детали, а ты получишь лог ошибки.


13. Подключение через окружение (.env)

Во фреймворках (Laravel, Symfony) часто используют .env-файлы:

.env

DB_HOST=localhost
DB_NAME=mydb
DB_USER=user
DB_PASS=secret

phpdotenv:

$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();

$pdo = new PDO("mysql:host={$_ENV['DB_HOST']};dbname={$_ENV['DB_NAME']}", $_ENV['DB_USER'], $_ENV['DB_PASS']);

Так пароли не попадают в код, и удобно менять конфигурацию на разных серверах.


14. Минимизируй права пользователя

Не давай аккаунту БД лишние права.

Например, если сайт только читает данные — не нужны INSERT, UPDATE и DELETE.

Создай отдельного пользователя в MySQL с нужными правами:

GRANT SELECT ON mydb.* TO 'readonly'@'localhost' IDENTIFIED BY 'password';

Если злоумышленник взломает код, он не сможет ничего испортить.


15. Проверяй подключение заранее

Иногда сайт может «упасть» из-за недоступной БД. Чтобы не рушить всё приложение, проверь соединение:

try {
    $pdo = new PDO($dsn, $user, $pass, [PDO::ATTR_TIMEOUT => 3]);
} catch (PDOException $e) {
    die("База недоступна. Попробуйте позже.");
}

ATTR_TIMEOUT ограничивает время ожидания (в секундах).


16. Настрой пул соединений

Если сайт большой, постоянное открытие и закрытие соединений — лишняя нагрузка.

Для производительности можно использовать Persistent connections:

$pdo = new PDO($dsn, $user, $pass, [
    PDO::ATTR_PERSISTENT => true
]);

Но будь осторожен: при ошибках такие соединения могут зависнуть.


17. SQL-инъекции — главный враг

Самая частая уязвимость — когда данные попадают в запрос без фильтрации.

Хакер вводит ' OR 1=1 -- и получает все данные из таблицы.

Чтобы избежать:

  • всегда используй prepare() и execute();

  • не вставляй переменные в SQL напрямую;

  • проверяй тип данных перед запросом.


18. Кэширование запросов

Если один и тот же запрос выполняется часто — можно его закэшировать.

Например, сохранить результат в Redis, Memcached или даже файл.

Так база не будет перегружена, и сайт ускорится в разы.


19. Оптимизация запросов

Даже правильное подключение не спасёт, если запросы медленные.

Проверь:

  • есть ли индексы (INDEX) на столбцах, по которым делаешь WHERE или JOIN;

  • не делаешь ли SELECT * (лучше выбирать конкретные поля);

  • используешь ли LIMIT при выборке.


20. Безопасность подключений

Если сервер базы данных на другом хосте — используй SSL-соединение.

$pdo = new PDO($dsn, $user, $pass, [
    PDO::MYSQL_ATTR_SSL_CA => '/path/ca-cert.pem'
]);

Так трафик между сервером и базой будет зашифрован.


21. Как тестировать подключение

Для проверки удобно создать мини-скрипт:

<?php
try {
    $pdo = new PDO("mysql:host=localhost;dbname=test;charset=utf8mb4", "root", "1234");
    echo "OK";
} catch (PDOException $e) {
    echo $e->getMessage();
}

Если видишь «OK» — всё работает. Если ошибка — смотри сообщение и логи.


22. Используй ORM (если проект большой)

Когда проект растёт, писать SQL вручную неудобно.

ORM (например, Eloquent в Laravel) делает это за тебя:

User::where('email', 'test@mail.com')->first();

Внутри это превращается в безопасный SQL-запрос, и код становится чище.


23. Резервные копии

Никогда не забывай про бэкапы. Даже если база защищена, сбой сервера может всё стереть.

Делай автоматические копии:

mysqldump -u user -p database > backup.sql

И проверяй, что архив действительно можно восстановить.


24. Следи за нагрузкой

Мониторинг помогает понять, где узкое место.

Полезные команды:

SHOW PROCESSLIST;
SHOW STATUS LIKE 'Threads_connected';

Так можно увидеть, сколько активных соединений и какие запросы зависли.


25. Вывод

Подключение к базе — не просто три строки кода. Это основа, на которой стоит всё приложение.

Если сделать это небрежно — уязвимости, утечки, падения.

Хорошее подключение — это:

  • PDO вместо старого mysqli;

  • конфиги вне публичной папки;

  • prepared statements;

  • ограниченные права;

  • логирование и бэкапы.

Когда база подключена правильно, она работает тихо и незаметно — как сердце, которое просто делает свою работу. ❤️

Для ответа вы можете авторизоваться