Pg select: примеры (PHP)
pg_select(PgSql\Connection $connection, string $table_name, array $conditions, int $flags = PGSQL_DML_EXEC, int $mode = PGSQL_ASSOC): string|array|boolФункция 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
)
)<?
$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'
Для работы с 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 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, ...);Изменения не затрагивают логику работы, но улучшают безопасность типов.
<?
$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
)
)<?
$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
)
)<?
$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'
<?
$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 или комбинируют флаги.
<?
$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
)
)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)]
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 }, ...]SELECT * FROM users WHERE status='active' AND category_id=5;Основное отличие pg_select от аналогов — это встроенная функция PHP для простых выборок без написания SQL, тогда как другие языки обычно требуют явного SQL-запроса.