Pg select: примеры (PHP)

Работа с pg_select в PHP
Раздел: Базы данных (PostgreSQL)
pg_select(PgSql\Connection $connection, string $table_name, array $conditions, int $flags = PGSQL_DML_EXEC, int $mode = PGSQL_ASSOC): string|array|bool
Описание функции pg_select

Функция pg_select используется для выборки строк из таблицы PostgreSQL, соответствующих заданным условиям. Она применяется, когда требуется удобный способ получить данные по критериям без написания полного SQL-запроса вручную.

Аргументы функции
  • connection — ресурс подключения к PostgreSQL.
  • table_name — имя таблицы для выборки данных.
  • assoc_array — ассоциативный массив условий, где ключи — имена столбцов, а значения — условия отбора. Строки сравниваются на равенство.
  • options — необязательный аргумент, который может включать флаги:
    • PGSQL_DML_EXEC — выполнить запрос (по умолчанию).
    • PGSQL_DML_ASYNC — выполнить асинхронно.
    • PGSQL_DML_ESCAPE — экранировать спецсимволы.
    • PGSQL_DML_NO_CONV — не преобразовывать значения.
    • PGSQL_DML_STRING — вернуть строку запроса вместо выполнения.
  • result_type — тип возвращаемого результата: PGSQL_ASSOC, PGSQL_NUM или PGSQL_BOTH.
Простые примеры использования
Базовый пример выборки
<?
$conn = pg_connect('host=localhost dbname=test user=postgres');
$conditions = ['status' => 'active', 'category_id' => 5];
$result = pg_select($conn, 'users', $conditions);
?>
Array
(
    [0] => Array
        (
            [id] => 1
            [name] => Иван
            [status] => active
            [category_id] => 5
        )
    [1] => Array
        (
            [id] => 3
            [name] => Мария
            [status] => active
            [category_id] => 5
        )
)
Использование флага PGSQL_DML_STRING
<?
$conn = pg_connect('host=localhost dbname=test user=postgres');
$conditions = ['status' => 'active'];
$query = pg_select($conn, 'users', $conditions, PGSQL_DML_STRING);
echo $query;
?>
SELECT * FROM users WHERE status='active'
Альтернативы в PHP

Для работы с PostgreSQL в PHP доступны другие функции:

  • pg_query + pg_fetch_assoc — выполнение произвольного SQL-запроса и получение результата. Предпочтительнее для сложных запросов с JOIN или агрегацией.
  • PDO::query — использование PDO для абстракции базы данных. Удобно при работе с разными СУБД или при необходимости prepared statements.
  • pg_prepare + pg_execute — подготовленные запросы для повторяющихся операций с параметрами, что повышает безопасность.

Функция pg_select удобна для простых выборок по условиям равенства, когда требуется минимальный код.

Типичные ошибки
Ошибка подключения к базе данных
<?
$conn = false; // Неудачное подключение
$conditions = ['id' => 1];
$result = pg_select($conn, 'users', $conditions);
if ($result === false) {
    echo pg_last_error(); // Выводит ошибку
}
?>
Warning: pg_select() expects parameter 1 to be resource, boolean given
Отсутствие таблицы или столбца
<?
$conn = pg_connect('host=localhost dbname=test user=postgres');
$conditions = ['invalid_column' => 'value']; // Столбец не существует
$result = pg_select($conn, 'users', $conditions);
if ($result === false) {
    echo pg_last_error($conn);
}
?>
ERROR: column "invalid_column" does not exist
Пустой результат
<?
$conn = pg_connect('host=localhost dbname=test user=postgres');
$conditions = ['status' => 'nonexistent'];
$result = pg_select($conn, 'users', $conditions);
if (empty($result)) {
    echo 'Нет данных'; // Это не ошибка, но нужно обрабатывать
}
?>
Нет данных
Изменения в последних версиях PHP

В PHP 8.0 функция pg_select стала строго типизированной: параметр connection теперь ожидается как ресурс PgSql\Connection (ранее был ресурсом resource). Несоответствие типа приводит к TypeError.

До PHP 8.0:

$conn = pg_connect(...); // resource
$result = pg_select($conn, ...);

С PHP 8.0:

$conn = pg_connect(...); // PgSql\Connection object
$result = pg_select($conn, ...);

Изменения не затрагивают логику работы, но улучшают безопасность типов.

Расширенные примеры
Использование флага PGSQL_DML_ESCAPE
Пример php
<?
$conn = pg_connect('host=localhost dbname=test user=postgres');
$conditions = ['name' => "O'Reilly"];
$result = pg_select($conn, 'authors', $conditions, PGSQL_DML_ESCAPE);
print_r($result);
?>
Array
(
    [0] => Array
        (
            [id] => 10
            [name] => O'Reilly
        )
)
Асинхронный запрос с PGSQL_DML_ASYNC
Пример php
<?
$conn = pg_connect('host=localhost dbname=test user=postgres');
$conditions = ['status' => 'pending'];
$result = pg_select($conn, 'orders', $conditions, PGSQL_DML_ASYNC);
// Проверяем готовность результата
while (pg_connection_busy($conn)) {
    usleep(10000);
}
$asyncResult = pg_get_result($conn);
$rows = pg_fetch_all($asyncResult);
print_r($rows);
?>
Array
(
    [0] => Array
        (
            [id] => 5
            [status] => pending
        )
)
Комбинирование флагов
Пример php
<?
$conn = pg_connect('host=localhost dbname=test user=postgres');
$conditions = ['category' => 'books'];
// Экранирование и возврат строки запроса
$query = pg_select($conn, 'products', $conditions, PGSQL_DML_STRING | PGSQL_DML_ESCAPE);
echo $query;
?>
SELECT * FROM products WHERE category='books'
Выборка с указанием типа результата
Пример php
<?
$conn = pg_connect('host=localhost dbname=test user=postgres');
$conditions = ['id' => 2];
$result = pg_select($conn, 'users', $conditions, PGSQL_DML_EXEC, PGSQL_NUM);
print_r($result);
?>
Array
(
    [0] => Array
        (
            [0] => 2
            [1] => Анна
            [2] => active
        )
)
Работа с большими данными и лимитом

Функция pg_select не поддерживает LIMIT напрямую. Для этого используют pg_query или комбинируют флаги.

Пример php
<?
$conn = pg_connect('host=localhost dbname=test user=postgres');
$conditions = ['status' => 'active'];
// Сначала получаем строку запроса, затем модифицируем
$query = pg_select($conn, 'users', $conditions, PGSQL_DML_STRING);
$query .= ' LIMIT 10';
$result = pg_query($conn, $query);
$rows = pg_fetch_all($result);
print_r(array_slice($rows, 0, 2)); // Вывод первых двух строк для краткости
?>
Array
(
    [0] => Array
        (
            [id] => 1
            [name] => Иван
            [status] => active
        )
    [1] => Array
        (
            [id] => 3
            [name] => Мария
            [status] => active
        )
)
Аналоги в других языках
Python (psycopg2)
import psycopg2
conn = psycopg2.connect('host=localhost dbname=test user=postgres')
cur = conn.cursor()
cur.execute('SELECT * FROM users WHERE status=%s AND category_id=%s', ('active', 5))
rows = cur.fetchall()
print(rows)
[(1, 'Иван', 'active', 5), (3, 'Мария', 'active', 5)]
JavaScript (Node.js, pg library)
const { Client } = require('pg');
const client = new Client({ host: 'localhost', database: 'test', user: 'postgres' });
await client.connect();
const res = await client.query('SELECT * FROM users WHERE status=$1 AND category_id=$2', ['active', 5]);
console.log(res.rows);
[{ id: 1, name: 'Иван', status: 'active', category_id: 5 }, ...]
MySQL (SQL запрос)
SELECT * FROM users WHERE status='active' AND category_id=5;

Основное отличие pg_select от аналогов — это встроенная функция PHP для простых выборок без написания SQL, тогда как другие языки обычно требуют явного SQL-запроса.

PHP pg_select function comments

En
Pg select Select records