Способы подключения к базе данных в проектах на PHP

Раздел: Разработка на PHP -> Базы данных

Основной способ подключения: PDO

PHP Data Objects (PDO) - это универсальный интерфейс для работы с различными СУБД. Он поддерживает MySQL, PostgreSQL, SQLite, Oracle и другие. Основное преимущество - единый API и защита от SQL-инъекций через подготовленные запросы.

Пример подключения к MySQL через PDO:


$dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8mb4';
$user = 'root';
$password = '';
$options = [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
];
try {
    $pdo = new PDO($dsn, $user, $password, $options);
    echo 'Подключение установлено';
} catch (PDOException $e) {
    echo 'Ошибка: ' . $e->getMessage();
}
  

Параметры DSN: mysql:host - адрес сервера, dbname - имя базы данных, charset - кодировка. Опции задают режим ошибок (исключения) и способ выборки (ассоциативный массив).

Как подключиться к MySQL с помощью расширения mysqli?

Расширение mysqli предназначено специально для MySQL и существует в процедурном и объектно-ориентированном стиле. Оно предоставляет больше контроля над соединением, но не универсально.


// Объектно-ориентированный стиль
$mysqli = new mysqli('localhost', 'root', '', 'testdb');
if ($mysqli->connect_error) {
    die('Ошибка: ' . $mysqli->connect_error);
}
echo 'Подключение успешно';
  

При ошибке соединения объект содержит свойство connect_error. Для процедурного стиля используется функция mysqli_connect().

Типичная ошибка: "Warning: mysqli_connect(): (HY000/1045): Access denied for user..." - неверные логин или пароль. Проверьте учетные данные и права доступа.

Если расширение не установлено, возникнет фатальная ошибка "Call to undefined function mysqli_connect()". Убедитесь, что в php.ini включена директива extension=mysqli.

Как использовать SQLite в PHP без PDO?

Класс SQLite3 позволяет работать с файловыми базами SQLite. Он не требует сервера и удобен для локальных или тестовых проектов.


$db = new SQLite3('data.db');
if (!$db) {
    die('Ошибка открытия базы');
}
echo 'База открыта';
  

База создается автоматически, если файл не существует. Для выполнения запросов используйте методы query() или exec().

Проблема: "SQLite3::__construct(): Unable to open database... Permission denied" - нет прав на запись в директорию. Дайте пользователю веб-сервера доступ на запись.

Как подключиться к PostgreSQL через нативные функции?

Расширение pgsql предоставляет функции для прямого взаимодействия с PostgreSQL. Оно подходит, если проект завязан на конкретную СУБД.


$conn = pg_connect("host=localhost dbname=testdb user=postgres password=secret");
if (!$conn) {
    echo 'Ошибка подключения';
} else {
    echo 'Подключение выполнено';
}
  

В строке соединения указываются хост, порт (по умолчанию 5432), имя базы, пользователь и пароль.

Частая ошибка: "pg_connect(): Unable to connect to PostgreSQL server: could not connect to server" - сервер не запущен или неверный порт. Проверьте службу PostgreSQL.

Если расширение отсутствует, добавьте extension=pgsql в php.ini.

Расширенные примеры работы с базами данных

Пример 1. PDO с подготовленными запросами и транзакцией

Пример

try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8', 'root', '');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $pdo->beginTransaction();

    $stmt = $pdo->prepare('INSERT INTO users (name, email) VALUES (:name, :email)');
    $stmt->execute([':name' => 'Иван', ':email' => 'ivan@example.com']);
    $stmt->execute([':name' => 'Мария', ':email' => 'maria@example.com']);

    $pdo->commit();
    echo 'Транзакция завершена';
} catch (PDOException $e) {
    $pdo->rollBack();
    echo 'Ошибка: ' . $e->getMessage();
}
Транзакция завершена

Подготовленные запросы предотвращают SQL-инъекции. Транзакция гарантирует атомарность операций, откат при ошибке.

Пример 2. mysqli с подготовленными выражениями и выборкой

Пример

$mysqli = new mysqli('localhost', 'root', '', 'testdb');
if ($mysqli->connect_error) {
    die('Ошибка: ' . $mysqli->connect_error);
}

$stmt = $mysqli->prepare('SELECT id, name FROM users WHERE email = ?');
$email = 'ivan@example.com';
$stmt->bind_param('s', $email);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    echo 'ID: ' . $row['id'] . ', Имя: ' . $row['name'] . "\n";
}
$stmt->close();
$mysqli->close();
ID: 1, Имя: Иван

Метод bind_param привязывает переменные к плейсхолдерам. Тип 's' означает строку.

Пример 3. SQLite3 с созданием таблицы и запросом

Пример

$db = new SQLite3('example.db');
$db->exec('CREATE TABLE IF NOT EXISTS items (id INTEGER PRIMARY KEY, name TEXT, price REAL)');
$stmt = $db->prepare('INSERT INTO items (name, price) VALUES (:name, :price)');
$stmt->bindValue(':name', 'Товар 1', SQLITE3_TEXT);
$stmt->bindValue(':price', 99.99, SQLITE3_FLOAT);
$stmt->execute();

$result = $db->query('SELECT * FROM items');
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
    echo $row['name'] . ' - ' . $row['price'] . "\n";
}
Товар 1 - 99.99

Методы bindValue и bindParam работают аналогично PDO, но с константами типов SQLite3.

Пример 4. pg_connect с выборкой и обработкой ошибок

Пример

$conn = pg_connect("host=localhost port=5432 dbname=testdb user=postgres password=secret");
if (!$conn) {
    echo 'Не удалось подключиться';
    exit;
}

$result = pg_query($conn, 'SELECT version()');
if (!$result) {
    echo 'Ошибка запроса: ' . pg_last_error($conn);
} else {
    $row = pg_fetch_assoc($result);
    echo 'Версия PostgreSQL: ' . $row['version'];
    pg_free_result($result);
}
pg_close($conn);
Версия PostgreSQL: PostgreSQL 16.1 on x86_64-pc-linux-gnu...

Функция pg_last_error возвращает текст последней ошибки соединения или запроса.

Подключение к базе данных PHP - comments

En
подключения базы данных php (php)