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

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

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

Начать курс

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

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

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

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

Для начала убедитесь, что в вашей системе установлены драйверы pdo_pgsql и pgsql. Проверить это можно через phpinfo().

Пример подключения и вставки данных

<?php
$host = 'localhost';
$dbname = 'my_database';
$user = 'my_user';
$password = 'my_password';

try {
    // Создаем DSN (Data Source Name)
    $dsn = "pgsql:host=$host;dbname=$dbname";
    
    // Подключаемся
    $pdo = new PDO($dsn, $user, $password, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    ]);
    
    echo "Подключение к PostgreSQL установлено успешно!<br>";
    
    // Вставка данных с использованием подготовленных выражений
    $sql = "INSERT INTO users (name, email, age) VALUES (:name, :email, :age)";
    $stmt = $pdo->prepare($sql);
    
    $stmt->execute([
        ':name' => 'Иван Петров',
        ':email' => 'ivan@example.com',
        ':age' => 28
    ]);
    
    echo "Пользователь добавлен. ID: " . $pdo->lastInsertId();
    
} catch (PDOException $e) {
    echo "Ошибка подключения: " . $e->getMessage();
    die();
}
?>

Использование подготовленных выражений (prepared statements) защищает от SQL-инъекций и повышает производительность при многократных однотипных запросах.

Выборка данных с фильтрацией

<?php
$minAge = 25;
$search = "SELECT id, name, email, age FROM users WHERE age > :minAge ORDER BY age DESC";
$stmt = $pdo->prepare($search);
$stmt->execute([':minAge' => $minAge]);

$users = $stmt->fetchAll();

foreach ($users as $user) {
    echo "{$user['name']} ({$user['age']} лет) - {$user['email']}<br>";
}
?>

PostgreSQL поддерживает сложные JOIN, подзапросы, оконные функции и полнотекстовый поиск — это делает его идеальным выбором для проектов с жесткими требованиями к целостности данных.

2. Подключение к MongoDB через официальный драйвер

MongoDB — NoSQL база данных, хранящая данные в виде документов (JSON-подобных BSON-объектов). Она отлично подходит для проектов с гибкой схемой, быстрым прототипированием и горизонтальным масштабированием.

Для работы с MongoDB в PHP используется расширение mongodb и библиотека mongodb/mongodb (устанавливается через Composer).

Установка драйвера

# Через Composer в корне проекта
composer require mongodb/mongodb

Пример подключения и вставки документа

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

use MongoDB\Client;
use MongoDB\Driver\Exception\Exception;

try {
    // Подключение к локальному серверу
    $client = new Client("mongodb://localhost:27017");
    
    // Выбор базы данных и коллекции
    $collection = $client->my_database->users;
    
    // Вставка одного документа
    $insertResult = $collection->insertOne([
        'name' => 'Анна Смирнова',
        'email' => 'anna@example.com',
        'age' => 32,
        'interests' => ['программирование', 'чтение', 'путешествия'],
        'created_at' => new MongoDB\BSON\UTCDateTime()
    ]);
    
    echo "Документ добавлен. ID: " . $insertResult->getInsertedId() . "<br>";
    
    // Вставка нескольких документов
    $manyResult = $collection->insertMany([
        ['name' => 'Олег', 'email' => 'oleg@example.com', 'age' => 25],
        ['name' => 'Мария', 'email' => 'maria@example.com', 'age' => 30]
    ]);
    
    echo "Добавлено документов: " . $manyResult->getInsertedCount();
    
} catch (Exception $e) {
    echo "Ошибка: " . $e->getMessage();
}
?>

Поиск и фильтрация в MongoDB

<?php
// Поиск пользователей старше 25 лет
$filter = ['age' => ['$gt' => 25]];
$options = [
    'sort' => ['age' => -1],
    'projection' => ['name' => 1, 'email' => 1, 'age' => 1]
];

$cursor = $collection->find($filter, $options);

foreach ($cursor as $document) {
    echo "{$document['name']} - {$document['age']} лет<br>";
}
?>

Обратите внимание: MongoDB использует свою систему фильтрации с операторами $gt, $lt, $in и другими. Это может потребовать привыкания, если вы переходите с SQL.

3. Сравнение PostgreSQL и MongoDB для PHP-проектов

Выбор между PostgreSQL и MongoDB зависит от конкретных задач. Рассмотрим ключевые различия:

Критерий PostgreSQL MongoDB
Модель данных Реляционная (

Блоги

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