Работа с базами данных в 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 |
|---|---|---|
| Модель данных | Реляционная (
БлогиРекомендаций по книгамЧитайте также |