Работа с базами данных в 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(). - Неправильная обработка ошибок. Всегда обора