Организация файла db.php для соединения с MySQL

Раздел: Базы данных и PHP -> Подключение к MySQL

Основные способы подключения к MySQL через файл db.php

Наиболее эффективное решение: PDO с обработкой исключений

PDO (PHP Data Objects) предоставляет безопасный и универсальный способ работы с базами данных. Создаётся файл db.php, который инициализирует соединение и настраивает параметры. После его подключения через require в любом скрипте становится доступна переменная $pdo.


<?php
// db.php
$host = 'localhost';
$dbname = 'mydatabase';
$user = 'root';
$pass = 'password';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$dbname;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);
} catch (PDOException $e) {
    die('Ошибка подключения к базе данных: ' . $e->getMessage());
}
?>

Require db php (require db.php (подключение к бд))

После этого в любом скрипте достаточно написать require 'db.php'; и использовать переменную $pdo.

Типичные проблемы:

  • Расширение PDO не включено в PHP. Решение: установить пакет php-mysql.
  • Неверные учётные данные. Проверить host, имя пользователя, пароль, базу данных.
  • Ошибка "could not find driver". Убедиться, что установлен драйвер pdo_mysql.
  • Повторное подключение при множественных require. Используйте require_once.

Как подключиться к MySQL с помощью функции mysqli_connect?

Процедурный стиль mysqli подходит для простых проектов. Файл db.php создаёт ресурс соединения.


<?php
$link = mysqli_connect('localhost', 'root', 'password', 'mydatabase');
if (!$link) {
    die('Ошибка соединения: ' . mysqli_connect_error());
}
mysqli_set_charset($link, 'utf8mb4');
?>

подключение mysql php (подключение mysql к php)

Проблема: при завершении скрипта соединение не закрывается явно, но PHP делает это автоматически. Однако при частых include может возникнуть повторное подключение. Решение: использовать require_once вместо require.

Как организовать объектно-ориентированное подключение через mysqli?

Класс mysqli предоставляет удобный ООП интерфейс. В db.php создаётся объект, который затем используется.


<?php
$mysqli = new mysqli('localhost', 'root', 'password', 'mydatabase');
if ($mysqli->connect_error) {
    die('Ошибка подключения: ' . $mysqli->connect_error);
}
$mysqli->set_charset('utf8mb4');
?>

Как отделить конфигурацию от кода подключения?

Настройки выносятся в отдельный файл config.php, который подключается внутри db.php. Это упрощает изменение параметров без редактирования логики соединения.


// config.php
define('DB_HOST', 'localhost');
define('DB_NAME', 'mydatabase');
define('DB_USER', 'root');
define('DB_PASS', 'password');
define('DB_CHARSET', 'utf8mb4');

// db.php
require_once 'config.php';
$dsn = "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=" . DB_CHARSET;
// ... остальной код PDO

Как использовать require_once для предотвращения повторного подключения?

Вместо require используйте require_once, чтобы файл db.php был подключён только один раз, даже если его подключают в нескольких местах.


require_once 'db.php';
// Теперь можно использовать $pdo или $mysqli

Это особенно важно в архитектуре MVC или при подключении из различных частей приложения.

Ошибка "Cannot redeclare class" или "Cannot redeclare variable" может возникнуть, если файл db.php содержит объявление класса или функции, и подключается дважды через require. Решение: всегда применять require_once или проверять существование класс с помощью class_exists.

Как обработать ошибки подключения без остановки скрипта?

Вместо die() можно записать ошибку в лог и вернуть пользователю дружественное сообщение. Для этого в db.php используется блок try-catch с логированием.


<?php
try {
    $pdo = new PDO($dsn, $user, $pass, $options);
} catch (PDOException $e) {
    error_log("DB connection failed: " . $e->getMessage());
    // показать общее сообщение пользователю
    die('Временно недоступно. Пожалуйста, попробуйте позже.');
}
?>

Примеры расширенного использования db.php

Пример синглтона для соединения с БД

Класс Database гарантирует единственное соединение на всё приложение. Файл db.php возвращает экземпляр класса.

Пример

class Database {
    private static $instance = null;
    private $pdo;

    private function __construct() {
        $host = 'localhost';
        $dbname = 'test';
        $user = 'root';
        $pass = '';
        $charset = 'utf8mb4';
        $dsn = "mysql:host=$host;dbname=$dbname;charset=$charset";
        $options = [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        ];
        $this->pdo = new PDO($dsn, $user, $pass, $options);
    }

    public static function getInstance() {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    public function getConnection() {
        return $this->pdo;
    }
}

// db.php
return Database::getInstance();
// При require 'db.php' получаем объект Database
$db = require 'db.php';
$pdo = $db->getConnection();
// Теперь $pdo можно использовать для запросов

Пример использования .env для хранения конфигурации

Библиотека vlucas/phpdotenv позволяет загрузить переменные окружения из файла .env, что делает настройки безопаснее.

Пример

// db.php
require_once 'vendor/autoload.php';
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();

$host = $_ENV['DB_HOST'];
$dbname = $_ENV['DB_NAME'];
$user = $_ENV['DB_USER'];
$pass = $_ENV['DB_PASS'];
$charset = $_ENV['DB_CHARSET'] ?? 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$dbname;charset=$charset";
$pdo = new PDO($dsn, $user, $pass, [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
// Пример .env файла:
DB_HOST=localhost
DB_NAME=myapp
DB_USER=root
DB_PASS=secret

// Результат: соединение с использованием переменных из .env, пароль не виден в коде.

Пример работы с транзакциями с проверкой соединения

Использование PDO транзакций после подключения через db.php.

Пример

require 'db.php';

try {
    $pdo->beginTransaction();
    $pdo->exec("INSERT INTO orders (user_id, total) VALUES (1, 100)");
    $pdo->exec("UPDATE users SET balance = balance - 100 WHERE id = 1");
    $pdo->commit();
} catch (Exception $e) {
    $pdo->rollBack();
    error_log("Transaction failed: " . $e->getMessage());
}
// Если обе операции успешны - изменения фиксируются. При ошибке - откат. Соединение получено из db.php.

Пример вывода результатов запроса с помощью db.php

Подключаем db.php и выполняем SELECT.

Пример

require 'db.php';
$stmt = $pdo->query('SELECT id, name FROM users');
while ($row = $stmt->fetch()) {
    echo $row['name'] . '<br>';
}
Иван
Мария
Пётр

Пример обработки фатальной ошибки при отсутствии db.php

Если файл db.php не найден, require выдаст фатальную ошибку. Решение - проверка существования файла с помощью file_exists или использование include_once с возвращаемым значением.

Пример

$db = @include_once 'db.php';
if ($db === false) {
    die('Файл конфигурации базы данных не найден.');
}
// альтернатива:
if (!file_exists('db.php')) {
    die('Отсутствует файл db.php');
}
require_once 'db.php';
При отсутствии файла - скрипт останавливается с понятным сообщением, а не с необработанной ошибкой.

require db.php (подключение к БД) - comments

En
Require db php (php)