Коротко: подключиться к базе данных в PHP проще всего через PDO: создаёте объект с DSN, логином и паролем, а запросы выполняете подготовленными выражениями. Старое расширение mysql_* удалено и небезопасно; mysqli — альтернатива, но PDO удобнее (работает с разными СУБД).
Что использовать
| Расширение | Особенности |
|---|---|
| PDO | единый API, поддержка разных СУБД, подготовленные запросы |
| mysqli | только MySQL, процедурный и объектный стиль |
mysql_* |
удалено, использовать нельзя |
Вкладки: пошагово
$dsn = 'mysql:host=localhost;dbname=my_db;charset=utf8mb4';
$pdo = new PDO($dsn, 'user', 'password', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);Параметры лучше держать в конфиге (или константах), а не в коде страницы. Кодировка utf8mb4 — стандарт для современных сайтов.
$stmt = $pdo->prepare('SELECT id, title FROM posts WHERE status = ? ORDER BY id DESC');
$stmt->execute(['published']);
foreach ($stmt as $row) {
echo $row['title'];
}Значения передаются в execute() отдельно от SQL — это и защищает от инъекций.
$stmt = $pdo->prepare(
'INSERT INTO messages (name, email, body) VALUES (:name, :email, :body)'
);
$stmt->execute([
':name' => $name,
':email' => $email,
':body' => $body,
]);
$id = $pdo->lastInsertId();Именованные параметры читаются лучше позиционных. lastInsertId() вернёт ID новой записи.
- включите
ERRMODE_EXCEPTION— ошибки будут исключениями; - оборачивайте операции в
try/catch; - не показывайте текст ошибок посетителям, пишите в лог;
- используйте подготовленные выражения — никогда не склеивайте SQL;
- закрывайте соединение при необходимости:
$pdo = null;; - не храните пароль в публичных файлах.
"SELECT * FROM users WHERE login = '$login'" — классическая уязвимость. Через подготовленные выражения (как в примерах) такого не случится.Практика: подключение в проекте
- Вынесите параметры подключения в отдельный конфиг.
- Создавайте
PDOодин раз и переиспользуйте. - Включите режим исключений.
- Все запросы — только через
prepare/execute. - Обрабатывайте ошибки и логируйте.
- Проверьте работу на копии базы.
Частые ошибки: причина → решение
| Симптом | Причина | Решение |
|---|---|---|
| «Access denied» | неверные логин/пароль | сверить данные |
| Кракозябры | не задана кодировка | charset=utf8mb4 |
| Ошибки не видны | режим ошибок по умолчанию | ERRMODE_EXCEPTION |
| Уязвимость | конкатенация SQL | подготовленные выражения |
Проверьте себя
Вопросы и ответы
PDO удобнее: единый интерфейс, именованные параметры, поддержка разных баз данных. mysqli берите, если работаете только с MySQL и привыкли к нему.
PHP закрывает его сам при завершении скрипта. Явно — если процесс долгий или соединений много.
Ловите исключения и показывайте нейтральное сообщение, а детали пишите в лог. Посетителю не нужны названия таблиц и путей.
Строка подключения: тип базы, хост, имя базы и кодировка. Например, mysql:host=localhost;dbname=my_db;charset=utf8mb4.
Итоги
- Подключение — через PDO (или mysqli), параметры в конфиге.
- Все запросы — подготовленные выражения.
- Режим исключений и логирование ошибок обязательны.
mysql_*использовать нельзя.
Комментарии
Пока комментариев нет — будьте первым, кто поделится мнением.