Подключение базы данных в PHP: что важно знать 💾
- 1. Что вообще такое база данных
- 2. Старый способ — mysqli_connect()
- 3. Современный вариант — PDO
- 4. Где хранить данные для подключения
- 5. Проверяй соединение и ошибки
- 6. Как отправлять запросы безопасно
- 7. Как вставлять данные в базу
- 8. Как читать данные
- 9. Обновление и удаление
- 10. Кодировка — всегда utf8mb4
- 11. Разрывай соединение после работы
- 12. Обработка ошибок через try-catch
- 13. Подключение через окружение (.env)
- 14. Минимизируй права пользователя
- 15. Проверяй подключение заранее
- 16. Настрой пул соединений
- 17. SQL-инъекции — главный враг
- 18. Кэширование запросов
- 19. Оптимизация запросов
- 20. Безопасность подключений
- 21. Как тестировать подключение
- 22. Используй ORM (если проект большой)
- 23. Резервные копии
- 24. Следи за нагрузкой
- 25. Вывод
Без базы данных сайт — просто набор статических страниц. Никаких пользователей, постов, заказов или комментариев. Всё живое и динамичное на сайте работает именно благодаря БД.
Но как правильно подключить базу данных в 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;
-
ограниченные права;
-
логирование и бэкапы.
Когда база подключена правильно, она работает тихо и незаметно — как сердце, которое просто делает свою работу. ❤️