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

Работа с ошибками PostgreSQL через pg_last_error
Раздел: Базы данных (PostgreSQL)
pg_last_error(?PgSql\Connection $connection = null): string
Описание функции pg_last_error

Функция pg_last_error возвращает текстовое сообщение о последней ошибке, возникшей при работе с соединением PostgreSQL. Она применяется для отладки после неудачных операций с базой данных.

Использование функции актуально при выполнении запросов, установке соединений или других операциях с PostgreSQL, когда необходимо получить детальное описание проблемы.

Синтаксис и параметры

Функция имеет два варианта вызова:

pg_last_error(?PgSql\Connection $connection = null): string

$connection — необязательный параметр, представляющий соединение с базой данных. Если параметр не указан или равен null, используется последнее открытое соединение.

Возвращаемое значение — строка с описанием ошибки или пустая строка при отсутствии ошибок.

Базовые примеры использования
Ошибка соединения
$conn = pg_connect("host=localhost port=5432 dbname=test user=postgres password=wrong");
echo pg_last_error($conn);
FATAL: password authentication failed for user "postgres"
Ошибка выполнения запроса
$conn = pg_connect("host=localhost dbname=test user=postgres");
$result = pg_query($conn, "SELECT * FROM несуществующая_таблица");
if (!$result) {
    echo pg_last_error($conn);
}
ERROR: relation "несуществующая_таблица" does not exist
LINE 1: SELECT * FROM несуществующая_таблица
Использование без параметров
$conn = pg_connect("host=localhost dbname=test user=postgres");
pg_query($conn, "INVALID SQL");
echo pg_last_error();
ERROR: syntax error at or near "INVALID"
Похожие функции в PHP

Возвращает сообщение об ошибке, связанное с конкретным результатом запроса. Предпочтительнее при асинхронных запросах или когда нужно получить ошибку определенного результата.

pg_errormessage (устаревшая)

Алиас для pg_last_error в старых версиях PHP. Рекомендуется использовать pg_last_error.

Исключения PDO

При использовании PDO для PostgreSQL ошибки можно получать через PDO::errorInfo или обрабатывать исключения. PDO предоставляет более универсальный интерфейс для разных СУБД.

Аналоги в других языках
Python (psycopg2)
import psycopg2
try:
    conn = psycopg2.connect("dbname=test user=postgres")
    cur = conn.cursor()
    cur.execute("SELECT * FROM несуществующая_таблица")
except Exception as e:
    print(e)
relation "несуществующая_таблица" does not exist
JavaScript (node-postgres)
const { Client } = require('pg');
const client = new Client();
client.connect();
client.query('SELECT * FROM несуществующая_таблица', (err, res) => {
    console.log(err ? err.message : '');
});
relation "несуществующая_таблица" does not exist
MySQLi
$mysqli = new mysqli("localhost", "user", "pass", "test");
$mysqli->query("SELECT * FROM несуществующая_таблица");
echo $mysqli->error;
Table 'test.несуществующая_таблица' doesn't exist
Типичные ошибки
Использование после закрытого соединения
$conn = pg_connect("host=localhost dbname=test user=postgres");
pg_close($conn);
echo pg_last_error($conn);
Warning: pg_last_error(): supplied resource is not a valid PostgreSQL link resource
Неверный тип параметра
$conn = 'invalid';
echo pg_last_error($conn);
Warning: pg_last_error(): supplied resource is not a valid PostgreSQL link resource
Потеря контекста ошибки
$conn = pg_connect("host=localhost dbname=test user=postgres");
pg_query($conn, "INVALID SQL");
$anotherQuery = pg_query($conn, "SELECT 1");
echo pg_last_error($conn);
(пустая строка, так как последний запрос выполнен успешно)
Изменения в версиях PHP

В PHP 8.0 параметр $connection стал необязательным и может принимать значение null. Тип параметра изменен на PgSql\Connection вместо ресурса.

В PHP 8.1 все функции PostgreSQL, включая pg_last_error, поддерживают объекты PgSql\Connection вместо ресурсов.

Расширенные примеры
Логирование ошибок в файл
Пример php
$conn = pg_connect("host=localhost dbname=test user=postgres");
$result = pg_query($conn, "INVALID QUERY");
if (!$result) {
    $error = pg_last_error($conn);
    error_log(date('Y-m-d H:i:s') . ' PostgreSQL error: ' . $error . "\n", 3, 'errors.log');
    echo 'Произошла ошибка базы данных';
}
Сравнение с pg_result_error
Пример php
$conn = pg_connect("host=localhost dbname=test user=postgres");
$result = pg_query($conn, "SELECT * FROM несуществующая_таблица");
if (!$result) {
    echo 'pg_last_error: ' . pg_last_error($conn) . "\n";
    echo 'pg_result_error: ' . pg_result_error($result);
}
pg_last_error: ERROR: relation "несуществующая_таблица" does not exist
pg_result_error: ERROR: relation "несуществующая_таблица" does not exist
Обработка ошибок транзакций
Пример php
$conn = pg_connect("host=localhost dbname=test user=postgres");
pg_query($conn, "BEGIN");
pg_query($conn, "INSERT INTO users(id) VALUES (1)");
pg_query($conn, "INSERT INTO users(id) VALUES (1)"); // Дубликат ключа
if (pg_last_error($conn)) {
    pg_query($conn, "ROLLBACK");
    echo 'Транзакция отменена: ' . pg_last_error($conn);
} else {
    pg_query($conn, "COMMIT");
}
Транзакция отменена: ERROR: duplicate key value violates unique constraint "users_pkey"
Мониторинг нескольких соединений
Пример php
$conn1 = pg_connect("host=localhost dbname=test1 user=postgres");
$conn2 = pg_connect("host=localhost dbname=test2 user=postgres");

pg_query($conn1, "SELECT * FROM несуществующая_таблица");
$error1 = pg_last_error($conn1);

pg_query($conn2, "INVALID SQL");
$error2 = pg_last_error($conn2);

echo 'Ошибка в conn1: ' . $error1 . "\n";
echo 'Ошибка в conn2: ' . $error2;
Ошибка в conn1: ERROR: relation "несуществующая_таблица" does not exist
Ошибка в conn2: ERROR: syntax error at or near "INVALID"
Интеграция с системой оповещений
Пример php
function handlePgError($connection, $context = '') {
    $error = pg_last_error($connection);
    if (!empty($error)) {
        // Отправка в систему мониторинга
        $message = "PostgreSQL error in $context: $error";
        // Здесь может быть вызов API мониторинга
        file_put_contents('alerts.log', $message . "\n", FILE_APPEND);
        return true;
    }
    return false;
}

$conn = pg_connect("host=localhost dbname=test user=postgres");
pg_query($conn, "SELECT * FROM несуществующая");
if (handlePgError($conn, 'reporting_module')) {
    // Дополнительная обработка
    echo 'Выполнена обработка ошибки';
}

PHP pg_last_error function comments

En
Pg last error Get the last error message string of a connection