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

Работа с pg_exec: выполнение SQL команд в PostgreSQL из PHP
Раздел: Базы данных (PostgreSQL)
pg_exec(PgSql\Connection $connection, string $query): PgSql\Result|false

Функция pg_exec() выполняет SQL-запрос к базе данных PostgreSQL. Этот устаревший алиас для функции pg_query() применялся для отправки команд на сервер баз данных.

Аргументы функции

Функция принимает два аргумента:

  1. connection (ресурс) - обязательный. Идентификатор подключения к PostgreSQL, возвращаемый функциями pg_connect() или pg_pconnect().
  2. query (строка) - обязательный. SQL-запрос или команда для выполнения на сервере. Может содержать несколько выражений, разделенных точкой с запятой.

Функция возвращает ресурс результата запроса при успешном выполнении или false в случае ошибки.

Примеры выполнения запросов
Простой SELECT запрос
$conn = pg_connect("host=localhost dbname=test user=postgres");
$result = pg_exec($conn, "SELECT id, name FROM users WHERE active = true");
if ($result) {
    echo "Запрос выполнен успешно";
}
Ресурс результата #N
Вставка данных
$result = pg_exec($conn, "INSERT INTO products (title, price) VALUES ('Телефон', 25000)");
if ($result) {
    $affected_rows = pg_affected_rows($result);
    echo "Добавлено строк: $affected_rows";
}
Добавлено строк: 1
Запрос с синтаксической ошибкой
$result = pg_exec($conn, "SELEC * FROM users");
if (!$result) {
    echo "Ошибка в запросе: " . pg_last_error($conn);
}
Ошибка в запросе: ERROR: syntax error at or near "SELEC"
Аналоги в PHP

В современных версиях PHP рекомендуется использовать прямую замену:

  • pg_query() - функционально идентична pg_exec(). Является предпочтительным вариантом, так как pg_exec() считается устаревшим алиасом.
  • pg_query_params() - выполняет параметризованный запрос, что защищает от SQL-инъекций. Применяется при необходимости подстановки переменных в запрос.
  • pg_prepare() и pg_execute() - механизм подготовленных выражений. Полезен для многократного выполнения однотипных запросов.

Для операций, возвращающих единственное значение, удобнее использовать pg_query() в сочетании с pg_fetch_result().

Аналоги в других языках
Python (psycopg2)
import psycopg2
conn = psycopg2.connect("dbname=test user=postgres")
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
results = cursor.fetchall()
JavaScript (Node.js, pg)
const { Client } = require('pg');
const client = new Client();
await client.connect();
const res = await client.query('SELECT * FROM users');
console.log(res.rows);
MySQLi (PHP)
$mysqli = new mysqli('localhost', 'user', 'pass', 'test');
$result = $mysqli->query("SELECT * FROM users");

Ключевое отличие — в более современном подходе к работе с БД: часто используются параметризованные запросы или ORM, а не прямое выполнение строк SQL.

Типичные ошибки
Отсутствие проверки подключения
$conn = false;
$result = pg_exec($conn, "SELECT 1"); // Предупреждение и возврат false
Warning: pg_exec() expects parameter 1 to be resource, boolean given
Игнорирование проверки результата
$result = pg_exec($conn, "UPDATE table SET col = 1 WHERE id = 999");
$rows = pg_affected_rows($result); // Может выдать предупреждение, если $result === false
Уязвимости к SQL-инъекциям
$name = $_POST['name'];
$result = pg_exec($conn, "SELECT * FROM users WHERE name = '$name'"); // Опасный код

Для безопасности следует использовать pg_query_params().

Изменения в версиях PHP

Функция pg_exec() изначально являлась основным способом выполнения запросов. В PHP 4.2.0 появился её алиас pg_query().

В документации PHP 7.x и 8.x pg_exec() указана как устаревший алиас для pg_query(). Её использование не вызывает ошибок или предупреждений, но для обеспечения ясности кода и будущей совместимости рекомендуется применять pg_query().

Семантика и поведение функции не менялись с момента её введения.

Расширенные варианты использования
Выполнение нескольких команд в одном запросе
Пример php
$sql = "
    CREATE TEMP TABLE log (msg text);
    INSERT INTO log VALUES ('Старт');
    SELECT * FROM log;
";
$result = pg_exec($conn, $sql);
if ($result) {
    do {
        $rows = pg_fetch_all($result);
        print_r($rows);
    } while (pg_next_result($result));
}
Работа с курсором и большими результатами
Пример php
// Использование DECLARE CURSOR
pg_exec($conn, "DECLARE mycursor CURSOR FOR SELECT * FROM large_table");
$result = pg_exec($conn, "FETCH 100 FROM mycursor");
while ($row = pg_fetch_assoc($result)) {
    // Обработка порции данных
}
pg_exec($conn, "CLOSE mycursor");
Использование в устаревших процедурных скриптах
Пример php
$link = pg_connect("...");
pg_exec($link, "BEGIN");
$res1 = pg_exec($link, "INSERT INTO a VALUES (1)");
$res2 = pg_exec($link, "INSERT INTO b VALUES (2)");
if ($res1 && $res2) {
    pg_exec($link, "COMMIT");
} else {
    pg_exec($link, "ROLLBACK");
}

В современных приложениях подобную логику реализуют через PDO или используют pg_query().

PHP pg_exec function comments

En
Pg exec Execute a query