Pg set error verbosity: примеры (PHP)
pg_set_error_verbosity(PgSql\Connection $connection, int $verbosity): intФункция pg_set_error_verbosity() определяет уровень детализации сообщений об ошибках, которые возвращает сервер PostgreSQL. Она применяется для настройки количества информации в сообщениях об ошибках, что полезно при отладке SQL-запросов и обработке исключительных ситуаций в приложении.
Функция используется после установки соединения с базой данных. Она влияет на все последующие запросы, выполняемые через это соединение.
Аргументы функции:
- connection (ресурс PostgreSQL, необязательный) – идентификатор подключения к базе данных. Если параметр не указан, используется последнее открытое соединение.
- verbosity (целое число) – уровень детализации. Принимает одну из предопределенных констант:
PGSQL_ERRORS_TERSE– возвращаются краткие сообщения: severity, primary text и необязательно позиция ошибки.PGSQL_ERRORS_DEFAULT– стандартный уровень, включает severity, primary text, detail, hint и позицию.PGSQL_ERRORS_VERBOSE– максимальная детализация: добавляются информация о контексте, имени столбца, таблицы и схемы.
Функция возвращает предыдущий уровень детализации в виде целого числа или false в случае ошибки.
Код:
$conn = pg_connect('host=localhost dbname=test');
$oldLevel = pg_set_error_verbosity($conn, PGSQL_ERRORS_TERSE);
$result = pg_query($conn, 'SELECT * FROM несуществующая_таблица');
if (!$result) {
echo pg_last_error($conn);
}Результат (пример):
ERROR: relation "несуществующая_таблица" does not exist at character 15
Код:
pg_set_error_verbosity($conn, PGSQL_ERRORS_VERBOSE);
$result = pg_query($conn, 'INSERT INTO users (id) VALUES (NULL)');
if (!$result) {
echo pg_last_error($conn);
}Результат (пример):
ERROR: null value in column "id" violates not-null constraint DETAIL: Failing row contains (null). SCHEMA NAME: public TABLE NAME: users COLUMN NAME: id
- pg_last_error() – возвращает строку с последним сообщением об ошибке для соединения. Предпочтительнее для быстрого получения текста ошибки без изменения уровня детализации.
- pg_result_error() – получает сообщение об ошибке, связанное с конкретным ресурсом результата запроса. Используется, когда нужно получить ошибку для определенного запроса, а не соединения.
- pg_set_error_context_visibility() – управляет включением контекста ошибки в сообщения. Может комбинироваться с
pg_set_error_verbosityдля более тонкой настройки.
Выбор функции зависит от задачи: для глобальной настройки детализации используется pg_set_error_verbosity, для получения ошибки конкретного запроса – pg_result_error.
Уровень детализации ошибок настраивается через объект соединения или курсора. Пример:
import psycopg2
conn = psycopg2.connect('dbname=test')
cur = conn.cursor()
try:
cur.execute('SELECT * FROM несуществующая_таблица')
except psycopg2.Error as e:
print(e.pgerror) # Подробное сообщение
print(e.diag.table_name) # Доступ к деталям через диагностикуБиблиотека pg возвращает объект ошибки со свойствами. Пример:
const { Client } = require('pg');
const client = new Client();
client.connect();
client.query('SELECT * FROM несуществующая_таблица', (err, res) => {
if (err) {
console.log(err.message); // Основное сообщение
console.log(err.detail); // Детали
}
});Pg set error verbosity в MySQL
Для получения детальной информации об ошибках используются команды SHOW ERRORS или SHOW WARNINGS. Пример:
-- После ошибочного запроса:
SHOW ERRORS;
-- Или для получения кода, сообщения и уровня:
SHOW ERRORS LIMIT 1;В отличие от PHP, в MySQL детализация часто настраивается на уровне сессии или сервера через системные переменные.
Код:
$conn = pg_connect('host=localhost dbname=test');
$res = pg_set_error_verbosity($conn, 99); // Несуществующая константа
var_dump($res);Результат:
bool(false)
Код:
$res = pg_set_error_verbosity(null, PGSQL_ERRORS_VERBOSE);
var_dump($res);Результат:
bool(false)
В таких случаях следует проверять возвращаемое значение и наличие соединения с помощью pg_connection_status().
В PHP 8.0 серьезных изменений в работе функции pg_set_error_verbosity() не было. Поведение и сигнатура функции остались совместимыми с предыдущими версиями. Начиная с PHP 5.1.0, параметр connection является необязательным. В более ранних версиях он был обязательным.
Код:
function executeQueryWithVerbosity($conn, $query, $verbosity) {
$oldVerbosity = pg_set_error_verbosity($conn, $verbosity);
$result = pg_query($conn, $query);
pg_set_error_verbosity($conn, $oldVerbosity); // Восстановление
return $result;
}
$conn = pg_connect('host=localhost dbname=test');
$res = executeQueryWithVerbosity($conn, 'SELECT 1/0', PGSQL_ERRORS_VERBOSE);
if (!$res) {
echo pg_last_error($conn);
}Код:
$logDetail = (ENVIRONMENT == 'development') ? PGSQL_ERRORS_VERBOSE : PGSQL_ERRORS_TERSE;
pg_set_error_verbosity($conn, $logDetail);
$result = pg_query($conn, 'INVALID SQL');
if (!$result) {
error_log('DB Error: ' . pg_last_error($conn));
}Код:
pg_set_error_verbosity($conn, PGSQL_ERRORS_VERBOSE);
pg_query($conn, 'BEGIN');
$res1 = pg_query($conn, 'INSERT INTO users (name) VALUES (\'John\')');
$res2 = pg_query($conn, 'INSERT INTO posts (user_id, title) VALUES (999, \'Test\')'); // Ошибка FK
if (!$res1 || !$res2) {
$error = pg_last_error($conn);
pg_query($conn, 'ROLLBACK');
// Анализ $error для определения причины
} else {
pg_query($conn, 'COMMIT');
}PHP pg_set_error_verbosity function comments
- Php pg set error verbosity - аргументы и возвращаемое значение
- Функция php pg_set_error_verbosity - описание
- pg set error verbosity - примеры
- pg set error verbosity - похожие методы на php
- pg_set_error_verbosity на js, python, mysql
- pg set error verbosity изменения php
- Примеры pg_set_error_verbosity на php