Pg last error: примеры (PHP)
pg_last_error(?PgSql\Connection $connection = null): stringФункция 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"
Возвращает сообщение об ошибке, связанное с конкретным результатом запроса. Предпочтительнее при асинхронных запросах или когда нужно получить ошибку определенного результата.
Алиас для pg_last_error в старых версиях PHP. Рекомендуется использовать pg_last_error.
При использовании PDO для PostgreSQL ошибки можно получать через PDO::errorInfo или обрабатывать исключения. PDO предоставляет более универсальный интерфейс для разных СУБД.
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
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 = 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 8.0 параметр $connection стал необязательным и может принимать значение null. Тип параметра изменен на PgSql\Connection вместо ресурса.
В PHP 8.1 все функции PostgreSQL, включая pg_last_error, поддерживают объекты PgSql\Connection вместо ресурсов.
$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 'Произошла ошибка базы данных';
}$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
$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"
$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"
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 'Выполнена обработка ошибки';
}