PHP и PostgreSQL: полное руководство для веб-разработчика

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

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

Начать курс

PHP и PostgreSQL: почему эта связка — твой секретный козырь

Представь: ты строишь веб-приложение, которое должно выдерживать сотни тысяч запросов, не терять данные при сбоях и при этом оставаться гибким. PHP и PostgreSQL — это не просто комбинация, это архитектурный выбор, который отделяет любителей от профессионалов. Пока все гоняются за модными фреймворками, умные разработчики знают: настоящая мощь кроется в правильной связке языка и базы данных.

PostgreSQL — это не «еще одна база». Это объектно-реляционная СУБД с поддержкой JSONB, полнотекстового поиска, геоданных и транзакций уровня ACID. А PHP с его гибкостью и огромным комьюнити позволяет выжать из PostgreSQL максимум. В этом руководстве я покажу тебе не просто «как подключиться», а как строить надежные, быстрые и масштабируемые приложения.

1. Настройка окружения: с чего начать

Установка расширения для работы с PostgreSQL в PHP

Первое, что нужно сделать — убедиться, что в PHP есть драйвер для PostgreSQL. Обычно это два расширения: pdo_pgsql (для PDO) и pgsql (для нативных функций). Для Ubuntu/Debian установка выглядит так:

sudo apt-get install php-pgsql php-pdo
sudo service apache2 restart

На macOS через Homebrew:

brew install php@8.1
pecl install pdo_pgsql

Проверить, что расширение активно, можно через phpinfo() или командой:

php -m | grep pgsql

Важно: используй PDO (PHP Data Objects) — это единый интерфейс для работы с разными базами. Если завтра ты решишь перейти с PostgreSQL на MySQL, тебе не придется переписывать весь код. PDO — это стандарт безопасности и гибкости.

Создание базы данных и пользователя

Войди в PostgreSQL и создай тестовую среду:

sudo -u postgres psql

CREATE DATABASE pythonlib_db;
CREATE USER pythonlib_user WITH PASSWORD 'secure_password_123';
GRANT ALL PRIVILEGES ON DATABASE pythonlib_db TO pythonlib_user;
\q

Готово. Теперь у тебя есть база pythonlib_db и пользователь с правами. Никогда не используй postgres-пользователя в продакшне — это опасно.

2. Подключение к PostgreSQL из PHP: 3 способа

Способ 1: PDO (рекомендуемый)

PDO — это современный, безопасный и гибкий способ. Вот минимальный пример подключения:

<?php
$host = 'localhost';
$dbname = 'pythonlib_db';
$user = 'pythonlib_user';
$pass = 'secure_password_123';

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

Обрати внимание на ERRMODE_EXCEPTION — это включает режим исключений. Без него ты будешь гадать, почему запрос не работает.

Способ 2: Нативные функции pg_*

Классический способ, который до сих пор используется в легаси-проектах:

$conn = pg_connect("host=localhost dbname=pythonlib_db user=pythonlib_user password=secure_password_123");
if (!$conn) {
    die("Ошибка подключения: " . pg_last_error());
}
echo "Подключено через pg_connect";

Минус: нет единого интерфейса. Если перейдешь на MySQL — код придется переписывать.

Способ 3: Через Unix-сокет (для локальной разработки)

Если PostgreSQL установлен локально, можно подключиться без пароля через сокет:

$pdo = new PDO("pgsql:host=/var/run/postgresql;dbname=pythonlib_db", 'postgres');

Это быстро, но не подходит для продакшна.

3. Основные операции: SELECT, INSERT, UPDATE, DELETE

Безопасные запросы через подготовленные выражения

Забудь про конкатенацию строк в SQL — это путь к SQL-инъекциям. Используй подготовленные выражения (prepared statements). Вот как это работает:

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

// SELECT с параметром
$stmt = $pdo->prepare("SELECT * FROM users WHERE age > :min_age");
$stmt->execute([':min_age' => 18]);
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);

foreach ($users as $user) {
    echo "Имя: {$user['name']}, Возраст: {$user['age']}<br>";
}
?>

Важно: используй именованные плейсхолдеры (:name), а не вопросительные знаки — код становится читаемее.

UPDATE и DELETE с условиями

// Обновление
$stmt = $pdo->prepare("UPDATE users SET age = :new_age WHERE id = :id");
$stmt->execute([':new_age' => 30, ':id' => 1]);

// Удаление
$stmt = $pdo->prepare("DELETE FROM users WHERE email = :email");
$stmt->execute([':email' => 'ivan@example.com']);

4. Продвинутые техники: транзакции и JSONB

Транзакции: когда каждая операция на счету

Представь, что ты переводишь деньги между счетами. Если один запрос упадет, второй не должен выполниться. Транзакции гарантируют атомарность:

<?php
try {
    $pdo->beginTransaction();

    // Списать с первого счета
    $pdo->exec("UPDATE accounts SET balance = balance - 500 WHERE id = 1");
    // Зачислить на второй
    $pdo->exec("UPDATE accounts SET balance = balance + 500 WHERE id = 2");

    $pdo->commit();
    echo "Перевод выполнен успешно";
} catch (Exception $e) {
    $pdo->rollBack();
    echo "Ошибка транзакции: " . $e->getMessage();
}
?>

Всегда обрабатывай исключения — иначе при ошибке база останется в «подвешенном» состоянии.

Работа с JSONB в PostgreSQL

PostgreSQL умеет хранить JSON и делать по нему запросы. Это удобно, когда структура данных динамическая:

// Создание таблицы с JSONB
$pdo->exec("CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    attributes JSONB
)");

// Вставка JSON
$stmt = $pdo->prepare("                

Блоги

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