Pg result error: примеры (PHP)
pg_result_error(PgSql\Result $result): string|falseОсновные сведения о pg_result_error
Функция pg_result_error в PHP предназначена для получения сообщения об ошибке, связанной с конкретным результатом запроса к базе данных PostgreSQL. Эта функция используется после выполнения асинхронных запросов или в ситуациях, когда требуется получить детализированную информацию об ошибке для определенного ресурса результата.
Функция принимает два параметра:
- $result (ресурс) - обязательный параметр, представляющий ресурс результата запроса, возвращенный функциями
pg_query,pg_send_queryили аналогичными. - $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 несуществующая_таблица
<?
$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 удобнее для синхронных операций и быстрой проверки.
Аналоги в других языках
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: 42P01const { 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
<?
$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
Добавлен необязательный параметр $error_mode, принимающий значения:
PGSQL_ERRORS_TERSE- краткое сообщениеPGSQL_ERRORS_DEFAULT- стандартное сообщениеPGSQL_ERRORS_VERBOSE- подробное сообщение с дополнительной информацией
Изменен тип возвращаемого значения: теперь функция всегда возвращает string|false, тогда как ранее могла возвращать string для ошибки и false при отсутствии ошибки.
Расширенные примеры использования
<?
$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
)
)
<?
$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
<?
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
)