Работа с базами данных в PHP: PostgreSQL и MongoDB на практике

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с базами данных в PHP: PostgreSQL и MongoDB на практике

Современная веб-разработка на PHP редко обходится без взаимодействия с базами данных. Два популярных решения — реляционная PostgreSQL и документо-ориентированная MongoDB — предоставляют разработчикам гибкие инструменты для хранения и обработки данных. В этой статье мы разберём, как подключиться к каждой из этих СУБД, выполнить базовые CRUD-операции и избежать типичных ошибок. Все примеры кода написаны на PHP и готовы к использованию.

Подключение к PostgreSQL через PDO

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

Установите драйвер pdo_pgsql, если он ещё не активирован. Проверить это можно через phpinfo() или командой:

php -m | grep pdo_pgsql

Пример подключения к локальной базе данных:

<?php
$host = 'localhost';
$dbname = 'my_database';
$user = 'postgres';
$pass = 'secret';

try {
    $dsn = "pgsql:host=$host;dbname=$dbname";
    $pdo = new PDO($dsn, $user, $pass, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    ]);
    echo "Подключение к PostgreSQL успешно!";
} catch (PDOException $e) {
    die("Ошибка подключения: " . $e->getMessage());
}

После подключения выполним простую выборку данных. Создадим таблицу users и вставим несколько записей:

<?php
// Создание таблицы
$pdo->exec("CREATE TABLE IF NOT EXISTS users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)");

// Вставка данных через подготовленное выражение
$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
$stmt->execute([':name' => 'Иван Петров', ':email' => 'ivan@example.com']);
echo "Пользователь добавлен, ID: " . $pdo->lastInsertId();

// Выборка всех пользователей
$users = $pdo->query("SELECT * FROM users")->fetchAll();
foreach ($users as $user) {
    echo "{$user['name']} - {$user['email']}<br>";
}

Работа с MongoDB через официальный драйвер

MongoDB — NoSQL база данных, хранящая данные в формате BSON (бинарный JSON). Для PHP существует официальный драйвер mongodb, который устанавливается через Composer вместе с библиотекой mongodb/mongodb.

Установка:

composer require mongodb/mongodb

Подключение к MongoDB и выбор базы данных:

<?php
require 'vendor/autoload.php';

use MongoDB\Client;

$uri = 'mongodb://localhost:27017';
$client = new Client($uri);
$collection = $client->my_database->users; // база my_database, коллекция users

echo "Подключение к MongoDB выполнено";

Теперь выполним CRUD-операции. В MongoDB данные представляются в виде ассоциативных массивов:

<?php
// Вставка документа
$insertResult = $collection->insertOne([
    'name' => 'Анна Смирнова',
    'email' => 'anna@example.com',
    'age' => 28,
    'tags' => ['php', 'mongodb']
]);
echo "ID нового документа: " . $insertResult->getInsertedId();

// Поиск по полю
$user = $collection->findOne(['email' => 'anna@example.com']);
echo "Имя: " . $user['name'];

// Обновление: добавляем поле "status"
$collection->updateOne(
    ['email' => 'anna@example.com'],
    ['$set' => ['status' => 'active']]
);

// Удаление
$collection->deleteOne(['email' => 'anna@example.com']);

Сравнение подходов: когда выбирать PostgreSQL, а когда MongoDB

Выбор между реляционной и документной БД зависит от структуры данных и требований проекта. Рассмотрим ключевые различия:

  • Схема данных: PostgreSQL требует жёсткой схемы (таблицы, типы полей), MongoDB позволяет хранить документы с произвольной структурой.
  • Связи: В PostgreSQL связи реализуются через JOIN, в MongoDB — через вложенные документы или ссылки на другие коллекции.
  • Транзакции: PostgreSQL поддерживает ACID-транзакции на уровне нескольких запросов; MongoDB — только с версии 4.0, но с ограничениями.
  • Производительность: MongoDB быстрее на операциях записи и чтения простых структур, PostgreSQL эффективен при сложных выборках с агрегацией.

Пример, когда лучше использовать PostgreSQL: интернет-магазин с каталогом товаров, заказами и пользователями — здесь важны целостность данных и сложные отчёты. MongoDB подойдёт для систем аналитики, логов, каталогов с разнородными атрибутами (например, товары с разными наборами характеристик).

Типичные ошибки и советы по оптимизации

При работе с базами данных в PHP разработчики часто допускают одни и те же ошибки. Вот основные из них:

  • Игнорирование подготовленных выражений. Встраивание переменных в SQL-запросы через конкатенацию — путь к SQL-инъекциям. Всегда используйте prepare() и execute().
  • Отсутствие индексов. Без индексов выборки в PostgreSQL замедляются на больших таблицах. Создавайте индексы для полей, по которым часто идёт поиск: CREATE INDEX idx_users_email ON users(email);
  • Чтение всех данных в память. Если коллекция MongoDB содержит миллионы документов, не используйте find() без фильтра. Добавляйте limit() и skip().
  • Неправильная обработка ошибок. Всегда обора

Блоги

Рекомендаций по книгам