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

Обработка ошибок PostgreSQL: функция pg_result_error
Раздел: Базы данных (PostgreSQL)
pg_result_error(PgSql\Result $result): string|false

Основные сведения о pg_result_error

Функция pg_result_error в PHP предназначена для получения сообщения об ошибке, связанной с конкретным результатом запроса к базе данных PostgreSQL. Эта функция используется после выполнения асинхронных запросов или в ситуациях, когда требуется получить детализированную информацию об ошибке для определенного ресурса результата.

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

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

  1. $result (ресурс) - обязательный параметр, представляющий ресурс результата запроса, возвращенный функциями pg_query, pg_send_query или аналогичными.
  2. $error_mode (целое число) - необязательный параметр, доступный с PHP 8.1. Определяет формат возвращаемого сообщения об ошибке. Может принимать значения PGSQL_ERRORS_TERSE, PGSQL_ERRORS_DEFAULT или PGSQL_ERRORS_VERBOSE.

Функция возвращает строку с сообщением об ошибке или false, если ошибки отсутствуют.

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

Базовое использование

Пример получения стандартного сообщения об ошибке:

<?
$conn = pg_connect('host=localhost dbname=test');
$result = pg_query($conn, "SELECT * FROM несуществующая_таблица");
if (!$result) {
    echo pg_result_error($result);
}
?>
ERROR: relation "несуществующая_таблица" does not exist
LINE 1: SELECT * FROM несуществующая_таблица
Использование с различными режимами вывода (PHP 8.1+)
<?
$result = pg_query($conn, "INVALID SQL");
if (!$result) {
    echo "Terse mode: ". pg_result_error($result, PGSQL_ERRORS_TERSE) . "\n";
    echo "Default mode: ". pg_result_error($result) . "\n";
    echo "Verbose mode: ". pg_result_error($result, PGSQL_ERRORS_VERBOSE) . "\n";
}
?>
Terse mode: ERROR: syntax error at or near "INVALID"
Default mode: ERROR: syntax error at or near "INVALID"
LINE 1: INVALID SQL
        ^
Verbose mode: ERROR: 42601: syntax error at or near "INVALID"
LINE 1: INVALID SQL
        ^
LOCATION: scanner_yyerror, scan.l:1153

Альтернативные функции в PHP

Возвращает последнее сообщение об ошибке для соединения. Работает с последней операцией на указанном соединении, не требует передачи ресурса результата.

Позволяет получить конкретное поле ошибки (код SQLSTATE, сообщение, детали). Обеспечивает более детализированный разбор ошибки по сравнению с pg_result_error.

Возвращает статус результата запроса. Может использоваться для проверки успешности выполнения операции перед вызовом pg_result_error.

pg_result_error предпочтительнее при работе с асинхронными запросами или когда необходимо связать ошибку с конкретным результатом. pg_last_error удобнее для синхронных операций и быстрой проверки.

Аналоги в других языках

Python (psycopg2)
import psycopg2
try:
    conn = psycopg2.connect("dbname=test")
    cur = conn.cursor()
    cur.execute("SELECT * FROM несуществующая_таблица")
except psycopg2.Error as e:
    print(f"Error: {e.pgerror}")
    print(f"SQLSTATE: {e.pgcode}")
Error: relation "несуществующая_таблица" does not exist
LINE 1: SELECT * FROM несуществующая_таблица
                      ^
SQLSTATE: 42P01
JavaScript (Node.js, pg package)
const { Client } = require('pg');
const client = new Client();
client.connect();
client.query('SELECT * FROM несуществующая_таблица', (err, res) => {
    if (err) {
        console.log('Error:', err.message);
    }
});
Error: relation "несуществующая_таблица" does not exist
MySQL (PHP mysqli)
<?
$mysqli = new mysqli('localhost', 'user', 'pass', 'test');
$result = $mysqli->query("SELECT * FROM несуществующая_таблица");
if (!$result) {
    echo $mysqli->error;
}
?>
Table 'test.несуществующая_таблица' doesn't exist

Основное отличие PHP функции — возможность привязки ошибки к конкретному ресурсу результата и работа с асинхронными запросами.

Типичные ошибки при использовании

Передача неверного типа аргумента
<?
$error = pg_result_error("not_a_result_resource");
var_dump($error);
?>
Warning: pg_result_error(): supplied argument is not a valid PostgreSQL result resource in ...
bool(false)
Проверка ошибки для успешного запроса
<?
$result = pg_query($conn, "SELECT 1");
$error = pg_result_error($result);
var_dump($error);
?>
bool(false)
Использование после закрытия соединения
<?
$result = pg_query($conn, "SELECT * FROM несуществующая_таблица");
pg_close($conn);
echo pg_result_error($result);
?>
Warning: pg_result_error(): %d is not a valid PostgreSQL result resource in ...

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

PHP 8.1

Добавлен необязательный параметр $error_mode, принимающий значения:

  • PGSQL_ERRORS_TERSE - краткое сообщение
  • PGSQL_ERRORS_DEFAULT - стандартное сообщение
  • PGSQL_ERRORS_VERBOSE - подробное сообщение с дополнительной информацией
PHP 8.0

Изменен тип возвращаемого значения: теперь функция всегда возвращает string|false, тогда как ранее могла возвращать string для ошибки и false при отсутствии ошибки.

Расширенные примеры использования

Асинхронные запросы с обработкой ошибок
Пример php
<?
$conn = pg_connect('host=localhost dbname=test');
pg_send_query($conn, "SELECT * FROM несуществующая_таблица; SELECT 1");
while ($result = pg_get_result($conn)) {
    if (pg_result_status($result) === PGSQL_BAD_RESPONSE) {
        $error = pg_result_error($result);
        echo "Query failed: $error\n";
    } else {
        $data = pg_fetch_all($result);
        print_r($data);
    }
}
?>
Query failed: ERROR: relation "несуществующая_таблица" does not exist
LINE 1: SELECT * FROM несуществующая_таблица
                      ^
Array
(
    [0] => Array
        (
            [?column?] => 1
        )
)
Сравнение режимов вывода ошибок
Пример php
<?
$result = pg_query($conn, "SELECT * FROM table WHERE id = 'неправильный_тип'");
if (!$result) {
    $terse = pg_result_error($result, PGSQL_ERRORS_TERSE);
    $verbose = pg_result_error($result, PGSQL_ERRORS_VERBOSE);
    
    echo "Terse (27 chars): " . strlen($terse) . "\n";
    echo "Verbose (200+ chars): " . strlen($verbose) . "\n";
    
    // Парсинг SQLSTATE из verbose режима
    if (preg_match('/SQLSTATE: (\\d{5})/', $verbose, $matches)) {
        echo "SQLSTATE code: " . $matches[1] . "\n";
    }
}
?>
Terse (27 chars): 27
Verbose (200+ chars): 247
SQLSTATE code: 22P02
Интеграция с системой логирования
Пример php
<?
class PostgreSQLErrorHandler {
    public static function handleResultError($result, $query = '') {
        $error = pg_result_error($result);
        if ($error !== false) {
            $errorData = [
                'message' => $error,
                'query' => $query,
                'timestamp' => date('Y-m-d H:i:s'),
                'severity' => self::determineSeverity($error)
            ];
            
            // Логирование в файл
            file_put_contents('db_errors.log', 
                json_encode($errorData, JSON_UNESCAPED_UNICODE) . PHP_EOL, 
                FILE_APPEND);
            
            return $errorData;
        }
        return null;
    }
    
    private static function determineSeverity($error) {
        if (strpos($error, 'ERROR') === 0) return 'error';
        if (strpos($error, 'WARNING') === 0) return 'warning';
        return 'notice';
    }
}

$result = pg_query($conn, "INVALID QUERY");
$errorInfo = PostgreSQLErrorHandler::handleResultError($result, "INVALID QUERY");
print_r($errorInfo);
?>
Array
(
    [message] => ERROR: syntax error at or near "INVALID"
LINE 1: INVALID QUERY
        ^
    [query] => INVALID QUERY
    [timestamp] => 2024-01-15 10:30:00
    [severity] => error
)

PHP pg_result_error function comments

En
Pg result error Get error message associated with result