Pg result status: примеры (PHP)

Использование pg_result_status для проверки статуса запросов PostgreSQL
Раздел: Базы данных (PostgreSQL)
pg_result_status(PgSql\Result $result, int $mode = PGSQL_STATUS_LONG): string|int
Описание функции pg_result_status

Функция pg_result_status в PHP предназначена для получения статуса выполнения запроса к базе данных PostgreSQL. Эта функция используется после выполнения запросов через функции pg_query, pg_query_params или pg_execute для определения результата операции.

Аргументы функции
  • $result (обязательный) - ресурс результата запроса PostgreSQL, возвращаемый функциями выполнения запросов.
  • $result_type (опциональный) - константа, определяющая формат возвращаемого статуса:
    • PGSQL_STATUS_LONG - возвращает числовой код статуса (по умолчанию)
    • PGSQL_STATUS_STRING - возвращает строковое представление статуса

Функция позволяет определить, был ли запрос выполнен успешно, сколько строк затронуто, а также получить информацию о типе выполненной команды.

Примеры использования pg_result_status
Базовое применение

Проверка статуса SELECT запроса:

<?php
$conn = pg_connect("host=localhost dbname=test user=postgres");
$result = pg_query($conn, "SELECT * FROM users");
$status = pg_result_status($result);
echo "Статус: " . $status; // Обычно вернет PGSQL_TUPLES_OK (2)
?>
Статус: 2
Использование с PGSQL_STATUS_STRING
<?php
$result = pg_query($conn, "INSERT INTO users(name) VALUES ('Иван')");
$status = pg_result_status($result, PGSQL_STATUS_STRING);
echo "Статус: " . $status;
?>
Статус: PGSQL_COMMAND_OK
Проверка статуса после UPDATE
<?php
$result = pg_query($conn, "UPDATE users SET active = true WHERE id = 1");
$status = pg_result_status($result);
if ($status === PGSQL_COMMAND_OK) {
    echo "Команда выполнена успешно";
}
?>
Команда выполнена успешно
Похожие функции в PHP
  • pg_affected_rows - возвращает количество затронутых запросом строк. Предпочтительнее использовать для INSERT, UPDATE, DELETE операций.
  • pg_last_error - получает последнее сообщение об ошибке на подключении. Используется для диагностики проблем.
  • pg_result_error - возвращает сообщение об ошибке, связанное с конкретным результатом запроса.
  • pg_num_rows - определяет количество строк в результате SELECT запроса.

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

Аналоги в других языках
Python (psycopg2)
import psycopg2
conn = psycopg2.connect("dbname=test user=postgres")
cur = conn.cursor()
cur.execute("SELECT * FROM users")
print(cur.statusmessage)  # Аналог pg_result_status
SELECT 10
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.command); // 'SELECT'
console.log(res.rowCount); // количество строк
SELECT
10

Pg result status в MySQL

// В mysqli
$mysqli = new mysqli("localhost", "user", "pass", "test");
$result = $mysqli->query("SELECT * FROM users");
// Аналога pg_result_status нет, используется
// $mysqli->info для информации о последнем запросе
// $mysqli->affected_rows для количества строк
Типичные ошибки
Передача неверного ресурса
<?php
$status = pg_result_status(false);
var_dump($status);
?>
bool(false)
Использование после закрытия соединения
<?php
$conn = pg_connect("host=localhost dbname=test");
$result = pg_query($conn, "SELECT * FROM users");
pg_close($conn);
$status = pg_result_status($result); // Может вызвать предупреждение
?>
Неправильная интерпретация статуса
<?php
$result = pg_query($conn, "SELECT * FROM несуществующая_таблица");
$status = pg_result_status($result);
if ($status === PGSQL_COMMAND_OK) { // Это условие не выполнится
    echo "Успех";
} else {
    echo "Статус ошибки: " . $status;
}
?>
Статус ошибки: 7 (PGSQL_FATAL_ERROR)
Изменения в версиях PHP

В PHP 8.0 функция pg_result_status не претерпела значительных изменений, но была улучшена обработка типов аргументов. В более ранних версиях PHP (до 7.4) функция могла возвращать различные значения при некорректных аргументах. Начиная с PHP 8.0, при передаче неверного типа аргумента выбрасывается TypeError.

В PHP 8.1 были добавлены предупреждения о устаревших методах работы с ресурсами, но сама функция осталась неизменной. Рекомендуется использовать объектно-ориентированный стиль с PDO для новых проектов.

Расширенные примеры
Мониторинг выполнения длительных операций
Пример php
<?php
$conn = pg_connect("host=localhost");
$result = pg_query($conn, "\n    WITH RECURSIVE t(n) AS (\n        VALUES (1)\n        UNION ALL\n        SELECT n+1 FROM t WHERE n < 1000000\n    )\n    SELECT SUM(n) FROM t");

$status = pg_result_status($result, PGSQL_STATUS_STRING);
$rows = pg_affected_rows($result);
echo "Статус: {$status}, Затронуто строк: {$rows}";
?>
Статус: PGSQL_TUPLES_OK, Затронуто строк: 1
Обработка COPY операций
Пример php
<?php
$result = pg_query($conn, "COPY users TO STDOUT WITH CSV");
$status = pg_result_status($result);

if ($status === PGSQL_COPY_OUT) {
    echo "Начата операция выгрузки данных\n";
    while ($row = pg_fetch_row($result)) {
        echo implode(',', $row) . "\n";
    }
}
?>
Определение типа выполненной команды
Пример php
<?php
function get_command_type($result) {
    $status = pg_result_status($result, PGSQL_STATUS_STRING);
    
    $command_types = [
        'PGSQL_EMPTY_QUERY' => 'empty',
        'PGSQL_COMMAND_OK' => 'write',
        'PGSQL_TUPLES_OK' => 'read',
        'PGSQL_COPY_OUT' => 'copy_out',
        'PGSQL_COPY_IN' => 'copy_in'
    ];
    
    return $command_types[$status] ?? 'unknown';
}

$queries = [
    "SELECT 1",
    "INSERT INTO logs(message) VALUES ('test')",
    "COPY users FROM STDIN"
];

foreach ($queries as $query) {
    $result = pg_query($conn, $query);
    echo get_command_type($result) . "\n";
}
?>
read
write
copy_in
Интеграция с обработкой ошибок
Пример php
<?php
function execute_safe($conn, $query) {
    $result = pg_query($conn, $query);
    
    if (!$result) {
        return ['success' => false, 'error' => pg_last_error($conn)];
    }
    
    $status_num = pg_result_status($result);
    $status_str = pg_result_status($result, PGSQL_STATUS_STRING);
    
    $response = [
        'success' => $status_num <= PGSQL_TUPLES_OK,
        'status_code' => $status_num,
        'status_text' => $status_str,
        'affected_rows' => pg_affected_rows($result)
    ];
    
    if ($status_num === PGSQL_TUPLES_OK) {
        $response['data'] = pg_fetch_all($result);
    }
    
    return $response;
}

$result = execute_safe($conn, "DELETE FROM users WHERE id = 999");
print_r($result);
?>
Array
(
    [success] => 1
    [status_code] => 1
    [status_text] => PGSQL_COMMAND_OK
    [affected_rows] => 0
)

PHP pg_result_status function comments

En
Pg result status Get status of query result